From 3dedcdd460d15439348fbcbe4933d5d1b3424e96 Mon Sep 17 00:00:00 2001 From: ila Date: Tue, 6 Oct 2026 00:21:30 +0200 Subject: [PATCH 1/3] Element-wise LIST MERGE path in the refresh compiler is unreachable --- src/include/upsert/refresh_compiler.hpp | 6 +- src/upsert/refresh_compiler.cpp | 53 +++------ src/upsert/refresh_sql.cpp | 18 +-- test/sql/list_no_elementwise_merge.test | 150 ++++++++++++++++++++++++ 4 files changed, 173 insertions(+), 54 deletions(-) create mode 100644 test/sql/list_no_elementwise_merge.test diff --git a/src/include/upsert/refresh_compiler.hpp b/src/include/upsert/refresh_compiler.hpp index c5536871..08c2693f 100644 --- a/src/include/upsert/refresh_compiler.hpp +++ b/src/include/upsert/refresh_compiler.hpp @@ -34,8 +34,8 @@ struct WindowPartitionDeltaSpec { string CompileAggregateGroups(const string &view_name, optional_ptr index_delta_view_catalog_entry, vector column_names, const string &view_query_sql = "", bool has_minmax = false, - bool list_mode = false, const string &delta_ts_filter = "", - const vector &group_column_names = {}, const string &catalog_prefix = "", + const string &delta_ts_filter = "", const vector &group_column_names = {}, + const string &catalog_prefix = "", bool insert_only = false, const vector &aggregate_types = {}, const vector &column_types = {}, bool use_current_diff_affected_keys = false, const vector *cascade_delta_specs = nullptr, @@ -46,7 +46,7 @@ string CompileAggregateGroups(const string &view_name, optional_ptr &preserved_side_cols = {}, bool *out_used_group_recompute = nullptr, bool force_group_recompute = false); string CompileSimpleAggregates(const string &view_name, const vector &column_names, - const string &view_query_sql = "", bool has_minmax = false, bool list_mode = false, + const string &view_query_sql = "", bool has_minmax = false, const string &delta_ts_filter = "", const string &catalog_prefix = "", bool insert_only = false, const vector &column_types = {}, bool *out_full_recompute = nullptr); diff --git a/src/upsert/refresh_compiler.cpp b/src/upsert/refresh_compiler.cpp index 25b13046..f5eb0248 100644 --- a/src/upsert/refresh_compiler.cpp +++ b/src/upsert/refresh_compiler.cpp @@ -11,8 +11,6 @@ namespace duckdb { -// Zero-initialized 64-element float list, used as COALESCE default for NULL list aggregates. -static constexpr const char *ZEROS_LIST = "[0.0::FLOAT FOR x IN generate_series(1, 64)]"; static constexpr idx_t GROUP_RECOMPUTE_DIFF_OCCURRENCE_THRESHOLD = 32; static constexpr idx_t GROUP_RECOMPUTE_DIFF_SQL_BYTES_THRESHOLD = 16ULL * 1024ULL * 1024ULL; @@ -529,7 +527,7 @@ static unordered_map DetectSumNullCountColumns(const vector index_delta_view_catalog_entry, vector column_names, const string &view_query_sql, bool has_minmax, - bool list_mode, const string &delta_ts_filter, const vector &group_column_names, + const string &delta_ts_filter, const vector &group_column_names, const string &catalog_prefix, bool insert_only, const vector &aggregate_types, const vector &column_types, bool use_current_diff_affected_keys, const vector *cascade_delta_specs, @@ -904,14 +902,6 @@ string CompileAggregateGroups(const string &view_name, optional_ptr= current) cte_select_string += "\n\tmax(" + column + ") as " + column + ", "; - } else if (list_mode) { - // Z-set bag-aware list sum: per-row scale every element by the row's weight, - // then list_reduce-add across the group. - cte_select_string += "\n\tlist_reduce(list(list_transform(" + column + - ", lambda x: " + string(openivm::MULTIPLICITY_COL) + - " * x)), lambda a, b: list_transform(list_zip(a, " - "b), lambda x: x[1] + x[2])) AS " + - column + ", "; } else { // Z-set bag-aware sum: weight w∈ℤ scales the column value before SUM. cte_select_string = cte_select_string + "\n\tsum(" + string(openivm::MULTIPLICITY_COL) + " * " + column + @@ -982,9 +972,6 @@ string CompileAggregateGroups(const string &view_name, optional_ptr &column_names, - const string &view_query_sql, bool has_minmax, bool list_mode, + const string &view_query_sql, bool has_minmax, const string &delta_ts_filter, const string &catalog_prefix, bool /*insert_only*/, const vector &column_types, bool *out_full_recompute) { string data_table = catalog_prefix + SqlUtils::QuoteIdentifier(IncrementalTableNames::DataTableName(view_name)); @@ -1318,31 +1305,19 @@ string CompileSimpleAggregates(const string &view_name, const vector &co update_set += ",\n "; } first = false; - if (list_mode) { - // Z-set bag-aware list sum: per-row scale every element by w∈ℤ, then - // list_reduce-add. NULL-list COALESCE preserves the previous semantics - // for empty groups. - cte += "COALESCE(list_reduce(list(list_transform(" + column + ", lambda x: " + mul + - " * x)), lambda a, b: list_transform(list_zip(a, b), lambda x: " - "x[1] + x[2])), " + - string(ZEROS_LIST) + ") AS d_" + column; - update_set += column + " = list_transform(list_zip(" + column + ", (SELECT d_" + column + - " FROM openivm_delta)), lambda x: x[1] + x[2])"; + // Z-set bag-aware sum: weight w∈ℤ scales the column value before SUM. + cte += "SUM(" + mul + " * " + column + ") AS d_" + column; + auto sum_count = sum_null_count_cols.find(column); + if (sum_count == sum_null_count_cols.end()) { + update_set += column + " = COALESCE(" + column + ", 0) + COALESCE((SELECT d_" + column + + " FROM openivm_delta), 0)"; } else { - // Z-set bag-aware sum: weight w∈ℤ scales the column value before SUM. - cte += "SUM(" + mul + " * " + column + ") AS d_" + column; - auto sum_count = sum_null_count_cols.find(column); - if (sum_count == sum_null_count_cols.end()) { - update_set += column + " = COALESCE(" + column + ", 0) + COALESCE((SELECT d_" + column + - " FROM openivm_delta), 0)"; - } else { - string count_col = sum_count->second; - string updated_sum = - "COALESCE(" + column + ", 0) + COALESCE((SELECT d_" + column + " FROM openivm_delta), 0)"; - string updated_count = - "COALESCE(" + count_col + ", 0) + COALESCE((SELECT d_" + count_col + " FROM openivm_delta), 0)"; - update_set += column + " = " + BuildNullableSum(updated_sum, updated_count); - } + string count_col = sum_count->second; + string updated_sum = + "COALESCE(" + column + ", 0) + COALESCE((SELECT d_" + column + " FROM openivm_delta), 0)"; + string updated_count = + "COALESCE(" + count_col + ", 0) + COALESCE((SELECT d_" + count_col + " FROM openivm_delta), 0)"; + update_set += column + " = " + BuildNullableSum(updated_sum, updated_count); } } cte += "\n FROM " + delta_view + ts_where + "\n)\n"; diff --git a/src/upsert/refresh_sql.cpp b/src/upsert/refresh_sql.cpp index 90b5336b..340267ec 100644 --- a/src/upsert/refresh_sql.cpp +++ b/src/upsert/refresh_sql.cpp @@ -780,15 +780,11 @@ string GenerateRefreshSQL(ClientContext &context, const string &view_catalog_nam auto column_metadata_start = profile_now(); vector column_names; vector column_types; - bool list_mode = false; auto read_delta_columns = [&](TableCatalogEntry &entry) { const auto &columns = entry.GetColumns(); column_names = columns.GetColumnNames(); for (auto &column : columns.Logical()) { column_types.push_back(column.GetType()); - if (column.GetName() != openivm::MULTIPLICITY_COL && column.GetType().id() == LogicalTypeId::LIST) { - list_mode = true; - } } }; if (delta_view_catalog_entry) { @@ -812,10 +808,8 @@ string GenerateRefreshSQL(ClientContext &context, const string &view_catalog_nam column_types.erase(column_types.begin() + offset); } } - OPENIVM_DEBUG_PRINT("[UPSERT] List mode: %s\n", list_mode ? "true" : "false"); add_profile_step("generate_refresh_sql.column_metadata", column_metadata_start, - "columns=" + to_string(column_names.size()) + - "; list_mode=" + string(list_mode ? "true" : "false")); + "columns=" + to_string(column_names.size())); string upsert_query; string appended_projection_rows; @@ -929,12 +923,12 @@ string GenerateRefreshSQL(ClientContext &context, const string &view_catalog_nam has_argminmax ? false : (has_minmax ? (insert_only && minmax_incremental) : skip_agg_delete); upsert_query = CompileAggregateGroups(view_name, index_delta_view_catalog_entry.get(), column_names, view_query_sql, - has_minmax, list_mode, delta_ts_filter, group_cols, internal_catalog_prefix, + has_minmax, delta_ts_filter, group_cols, internal_catalog_prefix, effective_insert_only, agg_types, column_types, has_unstripped_having); } else { upsert_query = CompileAggregateGroups( view_name, index_delta_view_catalog_entry.get(), column_names, view_query_sql, - /*has_minmax=*/true, list_mode, delta_ts_filter, group_cols, internal_catalog_prefix, + /*has_minmax=*/true, delta_ts_filter, group_cols, internal_catalog_prefix, /*insert_only=*/false, agg_types, column_types, has_unstripped_having); } break; @@ -948,7 +942,7 @@ string GenerateRefreshSQL(ClientContext &context, const string &view_catalog_nam bool effective_insert_only = has_argminmax ? false : skip_agg_delete; upsert_query = CompileAggregateGroups(view_name, index_delta_view_catalog_entry.get(), column_names, view_query_sql, - /*has_minmax=*/has_argminmax, list_mode, delta_ts_filter, group_cols, + /*has_minmax=*/has_argminmax, delta_ts_filter, group_cols, internal_catalog_prefix, effective_insert_only, agg_types, column_types); upsert_query += BuildFullOuterAffectedGroupRefresh(metadata, view_name, delta_table_names, group_cols, data_table, view_query_sql, delta_ts_filter, @@ -1072,7 +1066,7 @@ string GenerateRefreshSQL(ClientContext &context, const string &view_catalog_nam } bool ljsec_used_group_recompute = false; upsert_query = CompileAggregateGroups( - view_name, index_delta_view_catalog_entry.get(), column_names, view_query_sql, has_minmax, list_mode, + view_name, index_delta_view_catalog_entry.get(), column_names, view_query_sql, has_minmax, delta_ts_filter, group_cols, internal_catalog_prefix, effective_insert_only, agg_types, column_types, /*use_current_diff_affected_keys=*/false, aggregate_cascade_specs_ptr, aggregate_recompute_lpts_prefix, /*emit_cascade_delta=*/aggregate_cascade_specs_ptr != nullptr, @@ -1133,7 +1127,7 @@ string GenerateRefreshSQL(ClientContext &context, const string &view_catalog_nam aux_meta.group_col.c_str(), aux_meta.sum_col.c_str(), aux_meta.comparison_op.c_str(), aux_meta.threshold_sql.c_str()); } else { - upsert_query = CompileSimpleAggregates(view_name, column_names, view_query_sql, has_minmax, list_mode, + upsert_query = CompileSimpleAggregates(view_name, column_names, view_query_sql, has_minmax, delta_ts_filter, internal_catalog_prefix, sa_insert_only, column_types, &simple_aggregate_full_recompute); } diff --git a/test/sql/list_no_elementwise_merge.test b/test/sql/list_no_elementwise_merge.test new file mode 100644 index 00000000..556eba2c --- /dev/null +++ b/test/sql/list_no_elementwise_merge.test @@ -0,0 +1,150 @@ +# name: test/sql/list_no_elementwise_merge.test +# description: LIST aggregate views are maintained by recompute; no element-wise list-sum merge is emitted +# group: [sql] + +require openivm + +statement ok +SET openivm_files_path='__TEST_DIR__'; + +statement ok +CREATE TABLE lnm_items (id INT, grp INT, val FLOAT[]); + +statement ok +INSERT INTO lnm_items VALUES + (1, 1, [1.0, 2.0]::FLOAT[]), + (2, 1, [3.0, 4.0]::FLOAT[]), + (3, 2, [5.0, 6.0]::FLOAT[]); + +# --- Grouped element-wise list_reduce(list(vec)) --- +statement ok +CREATE MATERIALIZED VIEW mv_lg AS + SELECT grp, + list_reduce(list(val), lambda a, b: list_transform(list_zip(a, b), lambda x: x[1] + x[2])) AS total + FROM lnm_items GROUP BY grp; + +# --- Global element-wise list_reduce(list(vec)) --- +statement ok +CREATE MATERIALIZED VIEW mv_ls AS + SELECT list_reduce(list(val), lambda a, b: list_transform(list_zip(a, b), lambda x: x[1] + x[2])) AS total + FROM lnm_items; + +# --- Grouped plain list(...) --- +statement ok +CREATE MATERIALIZED VIEW mv_lp AS + SELECT grp, list(id ORDER BY id) AS ids + FROM lnm_items GROUP BY grp; + +# Grouped LIST views route to group recompute (6). +query I +SELECT type FROM openivm_views WHERE view_name = '__openivm_mv_6d656d6f7279_6d61696e_6d765f6c67_'; +---- +6 + +query I +SELECT type FROM openivm_views WHERE view_name = '__openivm_mv_6d656d6f7279_6d61696e_6d765f6c70_'; +---- +6 + +statement ok +INSERT INTO lnm_items VALUES (4, 1, [10.0, 20.0]::FLOAT[]), (5, 3, [7.0, 8.0]::FLOAT[]); + +statement ok +DELETE FROM lnm_items WHERE id = 2; + +statement ok +UPDATE lnm_items SET val = [100.0, 200.0]::FLOAT[] WHERE id = 3; + +statement ok +PRAGMA refresh('mv_lg'); + +statement ok +PRAGMA refresh('mv_ls'); + +statement ok +PRAGMA refresh('mv_lp'); + +query I +SELECT COUNT(*) FROM ( + SELECT * FROM mv_lg + EXCEPT ALL + SELECT grp, list_reduce(list(val), lambda a, b: list_transform(list_zip(a, b), lambda x: x[1] + x[2])) + FROM lnm_items GROUP BY grp +); +---- +0 + +query I +SELECT COUNT(*) FROM ( + SELECT grp, list_reduce(list(val), lambda a, b: list_transform(list_zip(a, b), lambda x: x[1] + x[2])) + FROM lnm_items GROUP BY grp + EXCEPT ALL + SELECT * FROM mv_lg +); +---- +0 + +query I +SELECT COUNT(*) FROM ( + SELECT * FROM mv_ls + EXCEPT ALL + SELECT list_reduce(list(val), lambda a, b: list_transform(list_zip(a, b), lambda x: x[1] + x[2])) + FROM lnm_items +); +---- +0 + +query I +SELECT COUNT(*) FROM ( + SELECT list_reduce(list(val), lambda a, b: list_transform(list_zip(a, b), lambda x: x[1] + x[2])) + FROM lnm_items + EXCEPT ALL + SELECT * FROM mv_ls +); +---- +0 + +query I +SELECT COUNT(*) FROM ( + SELECT * FROM mv_lp + EXCEPT ALL + SELECT grp, list(id ORDER BY id) FROM lnm_items GROUP BY grp +); +---- +0 + +query I +SELECT COUNT(*) FROM ( + SELECT grp, list(id ORDER BY id) FROM lnm_items GROUP BY grp + EXCEPT ALL + SELECT * FROM mv_lp +); +---- +0 + +# None of the generated refresh files may contain the removed element-wise Z-set merge. +query I +SELECT CASE WHEN content NOT LIKE '%openivm_multiplicity * x%' + AND content NOT LIKE '%list_zip(v.%' + AND content LIKE '%openivm_recompute_%' + THEN 1 ELSE 0 END +FROM read_text('__TEST_DIR__/openivm_upsert_queries___openivm_mv_6d656d6f7279_6d61696e_6d765f6c67_.sql'); +---- +1 + +query I +SELECT CASE WHEN content NOT LIKE '%openivm_multiplicity * x%' + AND content NOT LIKE '%list_zip(v.%' + AND content NOT LIKE '%FOR x IN generate_series%' + THEN 1 ELSE 0 END +FROM read_text('__TEST_DIR__/openivm_upsert_queries___openivm_mv_6d656d6f7279_6d61696e_6d765f6c73_.sql'); +---- +1 + +query I +SELECT CASE WHEN content NOT LIKE '%openivm_multiplicity * x%' + AND content NOT LIKE '%list_zip(v.%' + THEN 1 ELSE 0 END +FROM read_text('__TEST_DIR__/openivm_upsert_queries___openivm_mv_6d656d6f7279_6d61696e_6d765f6c70_.sql'); +---- +1 From be6a514ba4812c2f456cd38c23164ebfda722181 Mon Sep 17 00:00:00 2001 From: ila Date: Tue, 6 Oct 2026 00:45:08 +0200 Subject: [PATCH 2/3] Element-wise LIST MERGE path in the refresh compiler is unreachable --- src/include/upsert/refresh_compiler.hpp | 23 ++++++++++------------- src/upsert/refresh_compiler.cpp | 8 ++++---- src/upsert/refresh_sql.cpp | 14 +++++++------- 3 files changed, 21 insertions(+), 24 deletions(-) diff --git a/src/include/upsert/refresh_compiler.hpp b/src/include/upsert/refresh_compiler.hpp index 08c2693f..b15431f9 100644 --- a/src/include/upsert/refresh_compiler.hpp +++ b/src/include/upsert/refresh_compiler.hpp @@ -32,19 +32,16 @@ struct WindowPartitionDeltaSpec { string source_column; }; -string CompileAggregateGroups(const string &view_name, optional_ptr index_delta_view_catalog_entry, - vector column_names, const string &view_query_sql = "", bool has_minmax = false, - const string &delta_ts_filter = "", const vector &group_column_names = {}, - const string &catalog_prefix = "", - bool insert_only = false, const vector &aggregate_types = {}, - const vector &column_types = {}, bool use_current_diff_affected_keys = false, - const vector *cascade_delta_specs = nullptr, - const string &cascade_lpts_table_prefix = "", bool emit_cascade_delta = false, - bool inline_cascade_delta = false, bool *out_handled_cascade_delta = nullptr, - const unordered_map &derived_output_expressions = {}, - bool derived_output_expressions_complete = false, - const vector &preserved_side_cols = {}, bool *out_used_group_recompute = nullptr, - bool force_group_recompute = false); +string CompileAggregateGroups( + const string &view_name, optional_ptr index_delta_view_catalog_entry, vector column_names, + const string &view_query_sql = "", bool has_minmax = false, const string &delta_ts_filter = "", + const vector &group_column_names = {}, const string &catalog_prefix = "", bool insert_only = false, + const vector &aggregate_types = {}, const vector &column_types = {}, + bool use_current_diff_affected_keys = false, const vector *cascade_delta_specs = nullptr, + const string &cascade_lpts_table_prefix = "", bool emit_cascade_delta = false, bool inline_cascade_delta = false, + bool *out_handled_cascade_delta = nullptr, const unordered_map &derived_output_expressions = {}, + bool derived_output_expressions_complete = false, const vector &preserved_side_cols = {}, + bool *out_used_group_recompute = nullptr, bool force_group_recompute = false); string CompileSimpleAggregates(const string &view_name, const vector &column_names, const string &view_query_sql = "", bool has_minmax = false, const string &delta_ts_filter = "", const string &catalog_prefix = "", diff --git a/src/upsert/refresh_compiler.cpp b/src/upsert/refresh_compiler.cpp index f5eb0248..7f2a1a10 100644 --- a/src/upsert/refresh_compiler.cpp +++ b/src/upsert/refresh_compiler.cpp @@ -1249,8 +1249,8 @@ string CompileAggregateGroups(const string &view_name, optional_ptr &column_names, - const string &view_query_sql, bool has_minmax, - const string &delta_ts_filter, const string &catalog_prefix, bool /*insert_only*/, + const string &view_query_sql, bool has_minmax, const string &delta_ts_filter, + const string &catalog_prefix, bool /*insert_only*/, const vector &column_types, bool *out_full_recompute) { string data_table = catalog_prefix + SqlUtils::QuoteIdentifier(IncrementalTableNames::DataTableName(view_name)); @@ -1309,8 +1309,8 @@ string CompileSimpleAggregates(const string &view_name, const vector &co cte += "SUM(" + mul + " * " + column + ") AS d_" + column; auto sum_count = sum_null_count_cols.find(column); if (sum_count == sum_null_count_cols.end()) { - update_set += column + " = COALESCE(" + column + ", 0) + COALESCE((SELECT d_" + column + - " FROM openivm_delta), 0)"; + update_set += + column + " = COALESCE(" + column + ", 0) + COALESCE((SELECT d_" + column + " FROM openivm_delta), 0)"; } else { string count_col = sum_count->second; string updated_sum = diff --git a/src/upsert/refresh_sql.cpp b/src/upsert/refresh_sql.cpp index 340267ec..39a58065 100644 --- a/src/upsert/refresh_sql.cpp +++ b/src/upsert/refresh_sql.cpp @@ -926,10 +926,10 @@ string GenerateRefreshSQL(ClientContext &context, const string &view_catalog_nam has_minmax, delta_ts_filter, group_cols, internal_catalog_prefix, effective_insert_only, agg_types, column_types, has_unstripped_having); } else { - upsert_query = CompileAggregateGroups( - view_name, index_delta_view_catalog_entry.get(), column_names, view_query_sql, - /*has_minmax=*/true, delta_ts_filter, group_cols, internal_catalog_prefix, - /*insert_only=*/false, agg_types, column_types, has_unstripped_having); + upsert_query = + CompileAggregateGroups(view_name, index_delta_view_catalog_entry.get(), column_names, view_query_sql, + /*has_minmax=*/true, delta_ts_filter, group_cols, internal_catalog_prefix, + /*insert_only=*/false, agg_types, column_types, has_unstripped_having); } break; } @@ -1127,9 +1127,9 @@ string GenerateRefreshSQL(ClientContext &context, const string &view_catalog_nam aux_meta.group_col.c_str(), aux_meta.sum_col.c_str(), aux_meta.comparison_op.c_str(), aux_meta.threshold_sql.c_str()); } else { - upsert_query = CompileSimpleAggregates(view_name, column_names, view_query_sql, has_minmax, - delta_ts_filter, internal_catalog_prefix, sa_insert_only, - column_types, &simple_aggregate_full_recompute); + upsert_query = CompileSimpleAggregates(view_name, column_names, view_query_sql, has_minmax, delta_ts_filter, + internal_catalog_prefix, sa_insert_only, column_types, + &simple_aggregate_full_recompute); } if (!has_minmax && aux_meta.aux_table.empty() && !simple_aggregate_full_recompute) { AppendSimpleAggregateEmptySourceNulling(metadata, upsert_query, view_name, column_names, data_table, From 514df6d588334d9746ebc10bc861d508947cbecb Mon Sep 17 00:00:00 2001 From: ila Date: Tue, 6 Oct 2026 00:56:14 +0200 Subject: [PATCH 3/3] Element-wise LIST MERGE path in the refresh compiler is unreachable --- test/sql/list_no_elementwise_merge.test | 55 +++++++++++++++++++++++-- 1 file changed, 52 insertions(+), 3 deletions(-) diff --git a/test/sql/list_no_elementwise_merge.test b/test/sql/list_no_elementwise_merge.test index 556eba2c..093ce395 100644 --- a/test/sql/list_no_elementwise_merge.test +++ b/test/sql/list_no_elementwise_merge.test @@ -35,16 +35,64 @@ CREATE MATERIALIZED VIEW mv_lp AS SELECT grp, list(id ORDER BY id) AS ids FROM lnm_items GROUP BY grp; -# Grouped LIST views route to group recompute (6). +# --- LIST-typed min() column: a LIST-typed delta column must not trigger any list-specific merge --- +statement ok +CREATE TABLE lnm_tags (id INT, grp INT, tags VARCHAR[]); + +statement ok +INSERT INTO lnm_tags VALUES (1, 1, ['b', 'c']), (2, 1, ['a', 'z']), (3, 2, ['q']); + +statement ok +CREATE MATERIALIZED VIEW mv_lm AS + SELECT grp, min(tags) AS min_tags + FROM lnm_tags GROUP BY grp; + +# View types are the classifier's: grouped -> AGGREGATE_GROUP (0), global -> SIMPLE_AGGREGATE (1). query I SELECT type FROM openivm_views WHERE view_name = '__openivm_mv_6d656d6f7279_6d61696e_6d765f6c67_'; ---- -6 +0 + +query I +SELECT type FROM openivm_views WHERE view_name = '__openivm_mv_6d656d6f7279_6d61696e_6d765f6c73_'; +---- +1 query I SELECT type FROM openivm_views WHERE view_name = '__openivm_mv_6d656d6f7279_6d61696e_6d765f6c70_'; ---- -6 +0 + +query I +SELECT type FROM openivm_views WHERE view_name = '__openivm_mv_6d656d6f7279_6d61696e_6d765f6c6d_'; +---- +0 + +statement ok +INSERT INTO lnm_tags VALUES (4, 1, ['0']), (5, 3, ['x']); + +statement ok +DELETE FROM lnm_tags WHERE id = 3; + +statement ok +PRAGMA refresh('mv_lm'); + +query I +SELECT COUNT(*) FROM ( + (SELECT * FROM mv_lm EXCEPT ALL SELECT grp, min(tags) FROM lnm_tags GROUP BY grp) + UNION ALL + (SELECT grp, min(tags) FROM lnm_tags GROUP BY grp EXCEPT ALL SELECT * FROM mv_lm) +); +---- +0 + +query I +SELECT CASE WHEN content NOT LIKE '%openivm_multiplicity * x%' + AND content NOT LIKE '%list_zip(v.%' + THEN 1 ELSE 0 END +FROM read_text('__TEST_DIR__/openivm_upsert_queries___openivm_mv_6d656d6f7279_6d61696e_6d765f6c6d_.sql'); +---- +1 statement ok INSERT INTO lnm_items VALUES (4, 1, [10.0, 20.0]::FLOAT[]), (5, 3, [7.0, 8.0]::FLOAT[]); @@ -136,6 +184,7 @@ query I SELECT CASE WHEN content NOT LIKE '%openivm_multiplicity * x%' AND content NOT LIKE '%list_zip(v.%' AND content NOT LIKE '%FOR x IN generate_series%' + AND content LIKE '%list_reduce%' THEN 1 ELSE 0 END FROM read_text('__TEST_DIR__/openivm_upsert_queries___openivm_mv_6d656d6f7279_6d61696e_6d765f6c73_.sql'); ----