docs/changelogs/v25.12.7.21-stable.md
apply_row_policy_after_final by default. Initially, when optimize_move_to_prewhere_if_final=0, both ROW POLICY and PREWHERE respect FINAL and were applied after FINAL. This was broken by #87303, which ignored the optimize_move_to_prewhere_if_final for the ROW POLICY filter. To fix this, this PR enables the setting apply_row_policy_after_final introduced in #91065. With apply_row_policy_after_final enabled, ROW POLICY would continue to respect FINAL by default, as previously. This PR is an incompatible change because it changes the behaviour for optimize_move_to_prewhere_if_final=1. Now, to get the ROW POLICY applied before FINAL, apply_row_policy_after_final should be used instead of optimize_move_to_prewhere_if_final. #97279 (Nikolai Kochetov).mergeTreeProjection table function was missing an access check, allowing users without SELECT permission on a table (but with permissions for table functions) to read data from its projections. This fix adds the same access check that mergeTreeIndex and mergeTreeAnalyzeIndexes already have. #95480 (Alexey Milovidov).ACCESS_DENIED for users without CREATE TEMPORARY TABLE permission when optimize_inverse_dictionary_lookup optimization rewrites dictGet(...) predicates. ClickHouse now skips the rewrite and executes the original expression. Closes #97269. #97484 (Nihal Z. Miaji).Set and MergeTreeIndexSet when processing columns with inner sparse subcolumns (e.g., Tuple columns from MergeTree parts with different sparse serialization profiles). #97493 (Alexey Milovidov).ORDER BY (key1, key2) and a row policy USING key1 = 5 can now serve ORDER BY key2 queries without an explicit sort. #97538 (János Benjamin Antal).BaseSettings::readBinary passes the index from accessor.find to field_infos[] without checking for the not-found sentinel value (i.e., -1), which may cause a std::vector out-of-bounds access. The issue was caught thanks to libcxx hardening. This probably happened during query plan deserialization when a newer server sends a setting unknown to an older server. The string-based read method already handles this correctly; readBinary was missing the same check. #97585 (Miсhael Stetsyuk).WHERE clause had more than 32 expressions with AND/ORs. #97698 (Shankar Iyer).