pull/7853/head
Mehmet Yilmaz 2025-01-20 19:29:08 +00:00
parent c2bc7aca4a
commit fe7d25ef77
4 changed files with 90 additions and 20 deletions

1
citus-tools Submodule

@ -0,0 +1 @@
Subproject commit 3376bd6845f0614908ed304f5033bd644c82d3bf

View File

@ -441,7 +441,7 @@ FilterShardsFromPgclass(Node *node, void *context)
/* /*
* We process the whole rtable rather than visiting individual RangeTblEntry's * We process the whole rtable rather than visiting individual RangeTblEntry's
* in the walker, since we need to know the varno to generate the right * in the walker, since we need to know the varno to generate the right
* fiter. * filter.
*/ */
int varno = 0; int varno = 0;
RangeTblEntry *rangeTableEntry = NULL; RangeTblEntry *rangeTableEntry = NULL;
@ -471,29 +471,47 @@ FilterShardsFromPgclass(Node *node, void *context)
/* make sure the expression is in the right memory context */ /* make sure the expression is in the right memory context */
MemoryContext originalContext = MemoryContextSwitchTo(queryContext); MemoryContext originalContext = MemoryContextSwitchTo(queryContext);
/* add relation_is_a_known_shard(oid) IS NOT TRUE to the quals of the query */
Node *newQual = CreateRelationIsAKnownShardFilter(varno);
/* add relation_is_a_known_shard(oid) IS NOT TRUE to the quals of the query */ #if PG_VERSION_NUM >= PG_VERSION_17
Node *newQual = CreateRelationIsAKnownShardFilter(varno); /*
Node *oldQuals = query->jointree->quals; * In PG17, MERGE queries introduce a new struct `mergeJoinCondition`.
if (oldQuals) * We need to handle this condition safely.
{ */
query->jointree->quals = (Node *) makeBoolExpr( if (query->mergeJoinCondition != NULL)
AND_EXPR, {
list_make2(oldQuals, newQual), /* Add the filter to mergeJoinCondition */
-1); query->mergeJoinCondition = (Node *) makeBoolExpr(
} AND_EXPR,
else list_make2(query->mergeJoinCondition, newQual),
{ -1);
query->jointree->quals = newQual; }
} else
#endif
{
/* Handle older versions or queries without mergeJoinCondition */
Node *oldQuals = query->jointree->quals;
if (oldQuals)
{
query->jointree->quals = (Node *) makeBoolExpr(
AND_EXPR,
list_make2(oldQuals, newQual),
-1);
}
else
{
query->jointree->quals = newQual;
}
}
MemoryContextSwitchTo(originalContext); MemoryContextSwitchTo(originalContext);
} }
return query_tree_walker((Query *) node, FilterShardsFromPgclass, context, 0); return query_tree_walker((Query *) node, FilterShardsFromPgclass, context, 0);
} }
return expression_tree_walker(node, FilterShardsFromPgclass, context); return expression_tree_walker(node, FilterShardsFromPgclass, context);
} }

View File

@ -2690,6 +2690,32 @@ SELECT * FROM sensor_readings ORDER BY 1;
(4 rows) (4 rows)
-- End of MERGE ... WHEN NOT MATCHED BY SOURCE tests -- End of MERGE ... WHEN NOT MATCHED BY SOURCE tests
-- Issue #7846
-- Create a non-distributed table with a random suffix
CREATE TABLE non_dist_table_12345 (id INTEGER);
-- Test crash scenario on a non-distributed table
MERGE INTO non_dist_table_12345 AS target_0
USING pg_catalog.pg_class AS ref_0
ON target_0.id = ref_0.relpages
WHEN NOT MATCHED THEN DO NOTHING;
-- Create a distributed table with a random suffix
CREATE TABLE dist_table_67890 (id INTEGER);
SELECT create_distributed_table('dist_table_67890', 'id');
create_distributed_table
--------------------------
(1 row)
-- Test crash scenario on a distributed table
MERGE INTO dist_table_67890 AS target_0
USING pg_catalog.pg_class AS ref_0
ON target_0.id = ref_0.relpages
WHEN NOT MATCHED THEN DO NOTHING;
ERROR: MERGE INTO an distributed table from Postgres table is not yet supported
-- Cleanup
DROP TABLE IF EXISTS non_dist_table_12345;
DROP TABLE IF EXISTS dist_table_67890 CASCADE;
-- End of Issue #7846
\set VERBOSITY terse \set VERBOSITY terse
SET client_min_messages TO WARNING; SET client_min_messages TO WARNING;
DROP SCHEMA pg17 CASCADE; DROP SCHEMA pg17 CASCADE;

View File

@ -1451,6 +1451,31 @@ SELECT * FROM sensor_readings ORDER BY 1;
-- End of MERGE ... WHEN NOT MATCHED BY SOURCE tests -- End of MERGE ... WHEN NOT MATCHED BY SOURCE tests
-- Issue #7846
-- Create a non-distributed table with a random suffix
CREATE TABLE non_dist_table_12345 (id INTEGER);
-- Test crash scenario on a non-distributed table
MERGE INTO non_dist_table_12345 AS target_0
USING pg_catalog.pg_class AS ref_0
ON target_0.id = ref_0.relpages
WHEN NOT MATCHED THEN DO NOTHING;
-- Create a distributed table with a random suffix
CREATE TABLE dist_table_67890 (id INTEGER);
SELECT create_distributed_table('dist_table_67890', 'id');
-- Test crash scenario on a distributed table
MERGE INTO dist_table_67890 AS target_0
USING pg_catalog.pg_class AS ref_0
ON target_0.id = ref_0.relpages
WHEN NOT MATCHED THEN DO NOTHING;
-- Cleanup
DROP TABLE IF EXISTS non_dist_table_12345;
DROP TABLE IF EXISTS dist_table_67890 CASCADE;
-- End of Issue #7846
\set VERBOSITY terse \set VERBOSITY terse
SET client_min_messages TO WARNING; SET client_min_messages TO WARNING;
DROP SCHEMA pg17 CASCADE; DROP SCHEMA pg17 CASCADE;