diff --git a/src/backend/distributed/executor/citus_custom_scan.c b/src/backend/distributed/executor/citus_custom_scan.c index 89f232eb6..a572be9f6 100644 --- a/src/backend/distributed/executor/citus_custom_scan.c +++ b/src/backend/distributed/executor/citus_custom_scan.c @@ -545,8 +545,8 @@ HandleDeferredShardPruningForFastPathQueries(DistributedPlan *distributedPlan) bool isMultiShardQuery = false; List *shardIntervalList = TargetShardIntervalForFastPathQuery(workerJob->jobQuery, - &workerJob->partitionKeyValue, - &isMultiShardQuery, NULL); + &isMultiShardQuery, NULL, + &workerJob->partitionKeyValue); /* * A fast-path router query can only yield multiple shards when the parameter diff --git a/src/backend/distributed/planner/multi_router_planner.c b/src/backend/distributed/planner/multi_router_planner.c index 223bc79d4..f0c371bf9 100644 --- a/src/backend/distributed/planner/multi_router_planner.c +++ b/src/backend/distributed/planner/multi_router_planner.c @@ -2091,8 +2091,9 @@ PlanRouterQuery(Query *originalQuery, plannerRestrictionContext->fastPathRestrictionContext->distributionKeyValue; List *shardIntervalList = - TargetShardIntervalForFastPathQuery(originalQuery, partitionValueConst, - &isMultiShardQuery, distributionKeyValue); + TargetShardIntervalForFastPathQuery(originalQuery, &isMultiShardQuery, + distributionKeyValue, + partitionValueConst); /* * This could only happen when there is a parameter on the distribution key. @@ -2375,25 +2376,32 @@ GetAnchorShardId(List *prunedShardIntervalListList) * one list of a a one shard interval (see FastPathRouterQuery() * for the detail). * - * Also set the outgoing partition column value if requested via - * partitionValueConst + * If the caller requested the distributionKey value that this function + * yields, set outputPartitionValueConst. */ List * -TargetShardIntervalForFastPathQuery(Query *query, Const **partitionValueConst, - bool *isMultiShardQuery, Const *distributionKeyValue) +TargetShardIntervalForFastPathQuery(Query *query, bool *isMultiShardQuery, + Const *inputDistributionKeyValue, + Const **outputPartitionValueConst) { Oid relationId = ExtractFirstDistributedTableId(query); - if (distributionKeyValue) + if (PartitionMethod(relationId) == DISTRIBUTE_BY_NONE) + { + /* we don't need to do shard pruning for reference tables */ + return list_make1(LoadShardIntervalList(relationId)); + } + + if (inputDistributionKeyValue && !inputDistributionKeyValue->constisnull) { DistTableCacheEntry *cache = DistributedTableCacheEntry(relationId); ShardInterval *shardInterval = - FindShardInterval(distributionKeyValue->constvalue, cache); + FindShardInterval(inputDistributionKeyValue->constvalue, cache); - if (partitionValueConst != NULL) + if (outputPartitionValueConst != NULL) { /* set the outgoing partition column value if requested */ - *partitionValueConst = distributionKeyValue; + *outputPartitionValueConst = inputDistributionKeyValue; } List *shardIntervalList = list_make1(shardInterval); @@ -2402,10 +2410,24 @@ TargetShardIntervalForFastPathQuery(Query *query, Const **partitionValueConst, Node *quals = query->jointree->quals; int relationIndex = 1; - Const *queryPartitionValueConst = NULL; + + /* + * We couldn't do the shard pruning based on inputDistributionKeyValue as it might + * be passed as NULL. Still, we can search the quals for distribution key. + */ + Const *distributionKeyValueInQuals = NULL; List *prunedShardIntervalList = PruneShards(relationId, relationIndex, make_ands_implicit((Expr *) quals), - &queryPartitionValueConst); + &distributionKeyValueInQuals); + + if (!distributionKeyValueInQuals || distributionKeyValueInQuals->constisnull) + { + /* + * If the distribution key equals to NULL, we prefer to treat it as a zero shard + * query as it cannot return any rows. + */ + return NIL; + } /* we're only expecting single shard from a single table */ Node *distKey PG_USED_FOR_ASSERTS_ONLY = NULL; @@ -2416,10 +2438,10 @@ TargetShardIntervalForFastPathQuery(Query *query, Const **partitionValueConst, *isMultiShardQuery = true; } else if (list_length(prunedShardIntervalList) == 1 && - partitionValueConst != NULL) + outputPartitionValueConst != NULL) { /* set the outgoing partition column value if requested */ - *partitionValueConst = queryPartitionValueConst; + *outputPartitionValueConst = distributionKeyValueInQuals; } return list_make1(prunedShardIntervalList); diff --git a/src/backend/distributed/planner/shard_pruning.c b/src/backend/distributed/planner/shard_pruning.c index 1e4e48d55..f0529357e 100644 --- a/src/backend/distributed/planner/shard_pruning.c +++ b/src/backend/distributed/planner/shard_pruning.c @@ -749,13 +749,21 @@ AddPartitionKeyRestrictionToInstance(ClauseWalkerContext *context, OpExpr *opCla constantClause); if (constantClause == NULL) { - /* couldn't coerce value, so we note this as a restriction we don't grok */ + /* couldn't coerce value, so we save it in otherRestrictions */ prune->otherRestrictions = lappend(prune->otherRestrictions, opClause); return; } } + if (constantClause->constisnull) + { + /* we cannot do pruning for NULL values, so we save it in otherRestrictions */ + prune->otherRestrictions = lappend(prune->otherRestrictions, opClause); + + return; + } + /* at this point, we'd better be able to pass binary Datums to comparison functions */ Assert(IsBinaryCoercible(constantClause->consttype, partitionColumn->vartype)); diff --git a/src/include/distributed/multi_router_planner.h b/src/include/distributed/multi_router_planner.h index e0ca1e835..80a625f54 100644 --- a/src/include/distributed/multi_router_planner.h +++ b/src/include/distributed/multi_router_planner.h @@ -77,9 +77,9 @@ extern List * WorkersContainingAllShards(List *prunedShardIntervalsList); extern uint64 GetAnchorShardId(List *relationShardList); extern List * TargetShardIntervalForFastPathQuery(Query *query, - Const **partitionValueConst, bool *isMultiShardQuery, - Const *distributionKeyValue); + Const *inputDistributionKeyValue, + Const **outGoingPartitionValueConst); extern void GenerateSingleShardRouterTaskList(Job *job, List *relationShardList, List *placementList, uint64 shardId); diff --git a/src/test/regress/expected/multi_router_planner_fast_path.out b/src/test/regress/expected/multi_router_planner_fast_path.out index e89122ec7..20392ad78 100644 --- a/src/test/regress/expected/multi_router_planner_fast_path.out +++ b/src/test/regress/expected/multi_router_planner_fast_path.out @@ -1636,6 +1636,68 @@ DEBUG: Plan is router executable 41 | 1 | aznavour | 11814 (5 rows) +EXECUTE author_articles(NULL); + id | author_id | title | word_count +--------------------------------------------------------------------- +(0 rows) + +EXECUTE author_articles(NULL); + id | author_id | title | word_count +--------------------------------------------------------------------- +(0 rows) + +EXECUTE author_articles(NULL); + id | author_id | title | word_count +--------------------------------------------------------------------- +(0 rows) + +EXECUTE author_articles(NULL); + id | author_id | title | word_count +--------------------------------------------------------------------- +(0 rows) + +EXECUTE author_articles(NULL); + id | author_id | title | word_count +--------------------------------------------------------------------- +(0 rows) + +EXECUTE author_articles(NULL); + id | author_id | title | word_count +--------------------------------------------------------------------- +(0 rows) + +EXECUTE author_articles(NULL); + id | author_id | title | word_count +--------------------------------------------------------------------- +(0 rows) + +PREPARE author_articles_update(int) AS + UPDATE articles_hash SET title = 'test' WHERE author_id = $1; +EXECUTE author_articles_update(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable +EXECUTE author_articles_update(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable +EXECUTE author_articles_update(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable +EXECUTE author_articles_update(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable +EXECUTE author_articles_update(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable +EXECUTE author_articles_update(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable +EXECUTE author_articles_update(NULL); -- queries inside plpgsql functions could be router plannable CREATE OR REPLACE FUNCTION author_articles_max_id() RETURNS int AS $$ DECLARE diff --git a/src/test/regress/expected/null_parameters.out b/src/test/regress/expected/null_parameters.out new file mode 100644 index 000000000..8f6c17922 --- /dev/null +++ b/src/test/regress/expected/null_parameters.out @@ -0,0 +1,1585 @@ +-- this file contain tests with pruning of NULL +-- values with prepared statements +CREATE SCHEMA null_parameters; +SET search_path TO null_parameters; +SET citus.next_shard_id TO 1680000; +CREATE TABLE text_dist_column (key text, value text); +SELECT create_distributed_table('text_dist_column', 'key'); + create_distributed_table +--------------------------------------------------------------------- + +(1 row) + +SET client_min_messages TO DEBUG; +PREPARE null_select_on_text AS SELECT count(*) FROM text_dist_column WHERE key = NULL; +EXECUTE null_select_on_text; +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text; + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text; + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text; + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text; + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text; + count +--------------------------------------------------------------------- + 0 +(1 row) + +PREPARE null_select_on_text_param(text) AS SELECT count(*) FROM text_dist_column WHERE key = $1; +EXECUTE null_select_on_text_param(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param(5::text); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param(NULL); + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param(NULL); + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param(NULL::varchar); + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param('test'::varchar); + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param(5::text); + count +--------------------------------------------------------------------- + 0 +(1 row) + +PREPARE null_select_on_text_param_and_false(text) AS SELECT count(*) FROM text_dist_column WHERE key = $1 AND false; +EXECUTE null_select_on_text_param_and_false(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_and_false(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_and_false(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_and_false(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_and_false(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_and_false(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_and_false(NULL); + count +--------------------------------------------------------------------- + 0 +(1 row) + +PREPARE null_select_on_text_param_and_in(text) AS SELECT count(*) FROM text_dist_column WHERE key IN ($1); +EXECUTE null_select_on_text_param_and_in(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_and_in(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_and_in(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_and_in(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_and_in(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_and_in(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +PREPARE null_select_on_text_param_and_in_2(text) AS SELECT count(*) FROM text_dist_column WHERE key IN ($1, 'test'); +EXECUTE null_select_on_text_param_and_in_2(NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable +DETAIL: distribution column value: test + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_and_in_2(NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable +DETAIL: distribution column value: test + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_and_in_2(NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable +DETAIL: distribution column value: test + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_and_in_2(NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable +DETAIL: distribution column value: test + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_and_in_2(NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable +DETAIL: distribution column value: test + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_and_in_2(NULL); +DEBUG: Router planner cannot handle multi-shard select queries +DEBUG: Creating router plan +DEBUG: Plan is router executable +DETAIL: distribution column value: test + count +--------------------------------------------------------------------- + 0 +(1 row) + +PREPARE null_select_on_text_param_and_in_3(text, text) AS SELECT count(*) FROM text_dist_column WHERE key IN ($1, $2); +EXECUTE null_select_on_text_param_and_in_3(NULL, NULL); +DEBUG: Router planner cannot handle multi-shard select queries + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_and_in_3(NULL, NULL); +DEBUG: Router planner cannot handle multi-shard select queries + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_and_in_3(NULL, NULL); +DEBUG: Router planner cannot handle multi-shard select queries + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_and_in_3(NULL, NULL); +DEBUG: Router planner cannot handle multi-shard select queries + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_and_in_3(NULL, NULL); +DEBUG: Router planner cannot handle multi-shard select queries + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_and_in_3(NULL, NULL); +DEBUG: Router planner cannot handle multi-shard select queries +DEBUG: Router planner cannot handle multi-shard select queries + count +--------------------------------------------------------------------- + 0 +(1 row) + +PREPARE null_select_on_text_param_and_in_4(text) AS SELECT count(*) FROM text_dist_column WHERE key IN ($1) AND false; +EXECUTE null_select_on_text_param_and_in_4(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_and_in_4(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_and_in_4(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_and_in_4(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_and_in_4(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_and_in_4(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +-- not a fast-path, still good to run +PREPARE null_select_on_text_param_and_in_5(text, text) AS SELECT count(*) FROM text_dist_column WHERE key = $1 OR key = $2; +EXECUTE null_select_on_text_param_and_in_5(NULL, NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_and_in_5(NULL, NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_and_in_5(1, NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable +DETAIL: distribution column value: 1 + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_and_in_5(NULL, NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_and_in_5(NULL, NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_and_in_5(NULL, NULL); +DEBUG: Router planner cannot handle multi-shard select queries +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_and_in_5(NULL, NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_and_in_5(NULL, NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_and_in_5(1, NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable +DETAIL: distribution column value: 1 + count +--------------------------------------------------------------------- + 0 +(1 row) + +-- not a fast-path, still good to have +PREPARE null_select_on_text_param_and_in_6(text) AS SELECT count(*) FROM text_dist_column WHERE key NOT IN (SELECT value FROM text_dist_column WHERE key = $1); +EXECUTE null_select_on_text_param_and_in_6(NULL); +DEBUG: Router planner cannot handle multi-shard select queries +DEBUG: Creating router plan +DEBUG: Plan is router executable +DEBUG: generating subplan XXX_1 for subquery SELECT value FROM null_parameters.text_dist_column WHERE (key OPERATOR(pg_catalog.=) NULL::text) +DEBUG: Plan XXX query after replacing subqueries and CTEs: SELECT count(*) AS count FROM null_parameters.text_dist_column WHERE (NOT (key OPERATOR(pg_catalog.=) ANY (SELECT intermediate_result.value FROM read_intermediate_result('XXX_1'::text, 'binary'::citus_copy_format) intermediate_result(value text)))) +DEBUG: Router planner cannot handle multi-shard select queries + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_and_in_6(NULL); +DEBUG: Router planner cannot handle multi-shard select queries +DEBUG: Creating router plan +DEBUG: Plan is router executable +DEBUG: generating subplan XXX_1 for subquery SELECT value FROM null_parameters.text_dist_column WHERE (key OPERATOR(pg_catalog.=) NULL::text) +DEBUG: Plan XXX query after replacing subqueries and CTEs: SELECT count(*) AS count FROM null_parameters.text_dist_column WHERE (NOT (key OPERATOR(pg_catalog.=) ANY (SELECT intermediate_result.value FROM read_intermediate_result('XXX_1'::text, 'binary'::citus_copy_format) intermediate_result(value text)))) +DEBUG: Router planner cannot handle multi-shard select queries + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_and_in_6(NULL); +DEBUG: Router planner cannot handle multi-shard select queries +DEBUG: Creating router plan +DEBUG: Plan is router executable +DEBUG: generating subplan XXX_1 for subquery SELECT value FROM null_parameters.text_dist_column WHERE (key OPERATOR(pg_catalog.=) NULL::text) +DEBUG: Plan XXX query after replacing subqueries and CTEs: SELECT count(*) AS count FROM null_parameters.text_dist_column WHERE (NOT (key OPERATOR(pg_catalog.=) ANY (SELECT intermediate_result.value FROM read_intermediate_result('XXX_1'::text, 'binary'::citus_copy_format) intermediate_result(value text)))) +DEBUG: Router planner cannot handle multi-shard select queries + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_and_in_6(NULL); +DEBUG: Router planner cannot handle multi-shard select queries +DEBUG: Creating router plan +DEBUG: Plan is router executable +DEBUG: generating subplan XXX_1 for subquery SELECT value FROM null_parameters.text_dist_column WHERE (key OPERATOR(pg_catalog.=) NULL::text) +DEBUG: Plan XXX query after replacing subqueries and CTEs: SELECT count(*) AS count FROM null_parameters.text_dist_column WHERE (NOT (key OPERATOR(pg_catalog.=) ANY (SELECT intermediate_result.value FROM read_intermediate_result('XXX_1'::text, 'binary'::citus_copy_format) intermediate_result(value text)))) +DEBUG: Router planner cannot handle multi-shard select queries + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_and_in_6(NULL); +DEBUG: Router planner cannot handle multi-shard select queries +DEBUG: Creating router plan +DEBUG: Plan is router executable +DEBUG: generating subplan XXX_1 for subquery SELECT value FROM null_parameters.text_dist_column WHERE (key OPERATOR(pg_catalog.=) NULL::text) +DEBUG: Plan XXX query after replacing subqueries and CTEs: SELECT count(*) AS count FROM null_parameters.text_dist_column WHERE (NOT (key OPERATOR(pg_catalog.=) ANY (SELECT intermediate_result.value FROM read_intermediate_result('XXX_1'::text, 'binary'::citus_copy_format) intermediate_result(value text)))) +DEBUG: Router planner cannot handle multi-shard select queries + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_and_in_6(NULL); +DEBUG: Router planner cannot handle multi-shard select queries +DEBUG: Router planner cannot handle multi-shard select queries +DEBUG: Creating router plan +DEBUG: Plan is router executable +DEBUG: generating subplan XXX_1 for subquery SELECT value FROM null_parameters.text_dist_column WHERE (key OPERATOR(pg_catalog.=) NULL::text) +DEBUG: Plan XXX query after replacing subqueries and CTEs: SELECT count(*) AS count FROM null_parameters.text_dist_column WHERE (NOT (key OPERATOR(pg_catalog.=) ANY (SELECT intermediate_result.value FROM read_intermediate_result('XXX_1'::text, 'binary'::citus_copy_format) intermediate_result(value text)))) +DEBUG: Router planner cannot handle multi-shard select queries + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_and_in_6(NULL); +DEBUG: Router planner cannot handle multi-shard select queries +DEBUG: Creating router plan +DEBUG: Plan is router executable +DEBUG: generating subplan XXX_1 for subquery SELECT value FROM null_parameters.text_dist_column WHERE (key OPERATOR(pg_catalog.=) NULL::text) +DEBUG: Plan XXX query after replacing subqueries and CTEs: SELECT count(*) AS count FROM null_parameters.text_dist_column WHERE (NOT (key OPERATOR(pg_catalog.=) ANY (SELECT intermediate_result.value FROM read_intermediate_result('XXX_1'::text, 'binary'::citus_copy_format) intermediate_result(value text)))) +DEBUG: Router planner cannot handle multi-shard select queries + count +--------------------------------------------------------------------- + 0 +(1 row) + +-- different expression types which may not be fast-path queries +PREPARE null_select_on_text_param_7(text) AS SELECT count(*) FROM text_dist_column WHERE (key = $1) is true; +EXECUTE null_select_on_text_param_7(NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_7(NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_7(NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_7(NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_7(NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_7(NULL); +DEBUG: Router planner cannot handle multi-shard select queries +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_7(NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +-- different expression types which may not be fast-path queries +PREPARE null_select_on_text_param_8(text) AS SELECT count(*) FROM text_dist_column WHERE key = ANY(ARRAY[$1]); +EXECUTE null_select_on_text_param_8(NULL); +DEBUG: Router planner cannot handle multi-shard select queries + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_8(NULL); +DEBUG: Router planner cannot handle multi-shard select queries + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_8(NULL); +DEBUG: Router planner cannot handle multi-shard select queries + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_8(NULL); +DEBUG: Router planner cannot handle multi-shard select queries + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_8(NULL); +DEBUG: Router planner cannot handle multi-shard select queries + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_8(NULL); +DEBUG: Router planner cannot handle multi-shard select queries +DEBUG: Router planner cannot handle multi-shard select queries + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_8(NULL); +DEBUG: Router planner cannot handle multi-shard select queries + count +--------------------------------------------------------------------- + 0 +(1 row) + +PREPARE null_select_on_text_param_9(text) AS SELECT count(*) FROM text_dist_column WHERE key = ANY(ARRAY[$1, 'test']); +EXECUTE null_select_on_text_param_9(NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable +DETAIL: distribution column value: test + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_9(NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable +DETAIL: distribution column value: test + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_9(NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable +DETAIL: distribution column value: test + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_9(NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable +DETAIL: distribution column value: test + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_9(NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable +DETAIL: distribution column value: test + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_9(NULL); +DEBUG: Router planner cannot handle multi-shard select queries +DEBUG: Creating router plan +DEBUG: Plan is router executable +DETAIL: distribution column value: test + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_9(NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable +DETAIL: distribution column value: test + count +--------------------------------------------------------------------- + 0 +(1 row) + +-- different expression types which may not be fast-path queries +PREPARE null_select_on_text_param_10(text) AS SELECT count(*) FROM text_dist_column WHERE key = ALL(ARRAY[$1]); +EXECUTE null_select_on_text_param_10(NULL); +DEBUG: Router planner cannot handle multi-shard select queries + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_10(NULL); +DEBUG: Router planner cannot handle multi-shard select queries + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_10(NULL); +DEBUG: Router planner cannot handle multi-shard select queries + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_10(NULL); +DEBUG: Router planner cannot handle multi-shard select queries + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_10(NULL); +DEBUG: Router planner cannot handle multi-shard select queries + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_10(NULL); +DEBUG: Router planner cannot handle multi-shard select queries +DEBUG: Router planner cannot handle multi-shard select queries + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_10(NULL); +DEBUG: Router planner cannot handle multi-shard select queries + count +--------------------------------------------------------------------- + 0 +(1 row) + +-- different expression types which may not be fast-path queries +PREPARE null_select_on_text_param_11(text) AS SELECT count(*) FROM text_dist_column WHERE (CASE WHEN key > $1 THEN key::int / 100 > 1 ELSE false END); +EXECUTE null_select_on_text_param_11(NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_11(NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_11(NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_11(NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_11(NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_11(NULL); +DEBUG: Router planner cannot handle multi-shard select queries +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_11(NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_11(NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +-- different expression types which may not be fast-path queries +PREPARE null_select_on_text_param_12(text) AS SELECT count(*) FROM text_dist_column WHERE COALESCE(($1::int/50000)::bool, false); +EXECUTE null_select_on_text_param_12(NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_12(NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_12(NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_12(NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_12(NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_12(NULL); +DEBUG: Router planner cannot handle multi-shard select queries +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_12(NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +-- different expression types which may not be fast-path queries +PREPARE null_select_on_text_param_13(text) AS SELECT count(*) FROM text_dist_column WHERE NULLIF(($1::int/50000)::bool, false); +EXECUTE null_select_on_text_param_13(NULL); +DEBUG: Router planner cannot handle multi-shard select queries + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_13(NULL); +DEBUG: Router planner cannot handle multi-shard select queries + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_13(NULL); +DEBUG: Router planner cannot handle multi-shard select queries + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_13(NULL); +DEBUG: Router planner cannot handle multi-shard select queries + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_13(NULL); +DEBUG: Router planner cannot handle multi-shard select queries + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_13(NULL); +DEBUG: Router planner cannot handle multi-shard select queries +DEBUG: Router planner cannot handle multi-shard select queries + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_13(NULL); +DEBUG: Router planner cannot handle multi-shard select queries + count +--------------------------------------------------------------------- + 0 +(1 row) + +PREPARE null_select_on_text_param_14(text) AS SELECT count(*) FROM text_dist_column WHERE key = $1 AND 0!=0; +EXECUTE null_select_on_text_param_14(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_14(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_14(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_14(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_14(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_14(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_14(NULL); + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_14(NULL); + count +--------------------------------------------------------------------- + 0 +(1 row) + +PREPARE null_select_on_text_param_15(text) AS SELECT count(*) FROM text_dist_column WHERE row(key, 100) > row($1, 0); +EXECUTE null_select_on_text_param_15(NULL); +DEBUG: Router planner cannot handle multi-shard select queries + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_15(NULL); +DEBUG: Router planner cannot handle multi-shard select queries + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_15(NULL); +DEBUG: Router planner cannot handle multi-shard select queries + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_15(NULL); +DEBUG: Router planner cannot handle multi-shard select queries + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_15(NULL); +DEBUG: Router planner cannot handle multi-shard select queries + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_15(NULL); +DEBUG: Router planner cannot handle multi-shard select queries +DEBUG: Router planner cannot handle multi-shard select queries + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_15(NULL); +DEBUG: Router planner cannot handle multi-shard select queries + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_15(NULL); +DEBUG: Router planner cannot handle multi-shard select queries + count +--------------------------------------------------------------------- + 0 +(1 row) + +PREPARE null_select_on_text_param_16(text) AS SELECT count(*) FROM text_dist_column WHERE key IS DISTINCT FROM $1; +EXECUTE null_select_on_text_param_16(NULL); +DEBUG: Router planner cannot handle multi-shard select queries + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_16(NULL); +DEBUG: Router planner cannot handle multi-shard select queries + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_16(NULL); +DEBUG: Router planner cannot handle multi-shard select queries + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_16(NULL); +DEBUG: Router planner cannot handle multi-shard select queries + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_16(NULL); +DEBUG: Router planner cannot handle multi-shard select queries + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_16(NULL); +DEBUG: Router planner cannot handle multi-shard select queries +DEBUG: Router planner cannot handle multi-shard select queries + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_16(NULL); +DEBUG: Router planner cannot handle multi-shard select queries + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_16(NULL); +DEBUG: Router planner cannot handle multi-shard select queries + count +--------------------------------------------------------------------- + 0 +(1 row) + +PREPARE null_select_on_text_param_17(text) AS SELECT count(*) FROM text_dist_column WHERE key = $1 AND 0!=1; +EXECUTE null_select_on_text_param_17(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_17(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_17(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_17(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_17(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_17(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_17(NULL); + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_17(NULL); + count +--------------------------------------------------------------------- + 0 +(1 row) + +PREPARE null_select_on_text_param_18(text) AS SELECT count(*) FROM text_dist_column WHERE key = upper($1); +EXECUTE null_select_on_text_param_18(NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_18(NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_18(NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_18(NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_18(NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_18(NULL); +DEBUG: Router planner cannot handle multi-shard select queries +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_18(NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +PREPARE null_select_on_text_param_19(text) AS SELECT count(*) FROM text_dist_column WHERE key = $1::varchar(4); +EXECUTE null_select_on_text_param_19(NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_19(NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_19(NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_19(NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_19(NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_19(NULL); +DEBUG: Router planner cannot handle multi-shard select queries +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_text_param_19(NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +PREPARE null_update_on_text AS UPDATE text_dist_column SET value = '' WHERE key = NULL; +EXECUTE null_update_on_text(NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable +EXECUTE null_update_on_text(NULL); +EXECUTE null_update_on_text(NULL); +EXECUTE null_update_on_text(NULL); +EXECUTE null_update_on_text(NULL); +EXECUTE null_update_on_text(NULL); +PREPARE null_update_on_text_param(text) AS UPDATE text_dist_column SET value = '' WHERE key = $1; +EXECUTE null_update_on_text_param(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable +EXECUTE null_update_on_text_param(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable +EXECUTE null_update_on_text_param(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable +EXECUTE null_update_on_text_param(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable +EXECUTE null_update_on_text_param(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable +EXECUTE null_update_on_text_param(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable +EXECUTE null_update_on_text_param(NULL); +PREPARE null_update_on_text_param_and_false(text) AS UPDATE text_dist_column SET value = '' WHERE key = $1 AND false; +EXECUTE null_update_on_text_param_and_false(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable +EXECUTE null_update_on_text_param_and_false(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable +EXECUTE null_update_on_text_param_and_false(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable +EXECUTE null_update_on_text_param_and_false(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable +EXECUTE null_update_on_text_param_and_false(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable +EXECUTE null_update_on_text_param_and_false(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable +EXECUTE null_update_on_text_param_and_false(NULL); +PREPARE null_update_on_text_param_and_in(text) AS UPDATE text_dist_column SET value = '' WHERE key IN ($1); +EXECUTE null_update_on_text_param_and_in(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable +EXECUTE null_update_on_text_param_and_in(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable +EXECUTE null_update_on_text_param_and_in(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable +EXECUTE null_update_on_text_param_and_in(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable +EXECUTE null_update_on_text_param_and_in(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable +EXECUTE null_update_on_text_param_and_in(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable +EXECUTE null_update_on_text_param_and_in(NULL); +PREPARE null_update_on_text_param_and_in_2(text) AS UPDATE text_dist_column SET value = '' WHERE key IN ($1, 'test'); +EXECUTE null_update_on_text_param_and_in_2(NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable +DETAIL: distribution column value: test +EXECUTE null_update_on_text_param_and_in_2(NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable +DETAIL: distribution column value: test +EXECUTE null_update_on_text_param_and_in_2(NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable +DETAIL: distribution column value: test +EXECUTE null_update_on_text_param_and_in_2(NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable +DETAIL: distribution column value: test +EXECUTE null_update_on_text_param_and_in_2(NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable +DETAIL: distribution column value: test +EXECUTE null_update_on_text_param_and_in_2(NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable +DEBUG: Creating router plan +DEBUG: Plan is router executable +DETAIL: distribution column value: test +EXECUTE null_update_on_text_param_and_in_2(NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable +DETAIL: distribution column value: test +PREPARE null_update_on_text_param_and_in_3(text, text) AS UPDATE text_dist_column SET value = '' WHERE key IN ($1, $2); +EXECUTE null_update_on_text_param_and_in_3(NULL, NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable +EXECUTE null_update_on_text_param_and_in_3(NULL, NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable +EXECUTE null_update_on_text_param_and_in_3(NULL, NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable +EXECUTE null_update_on_text_param_and_in_3(NULL, NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable +EXECUTE null_update_on_text_param_and_in_3(NULL, NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable +EXECUTE null_update_on_text_param_and_in_3(NULL, NULL); +DEBUG: Creating router plan +DEBUG: Plan is router executable +DEBUG: Creating router plan +DEBUG: Plan is router executable +EXECUTE null_update_on_text_param_and_in_3(NULL, 'test'); +DEBUG: Creating router plan +DEBUG: Plan is router executable +DETAIL: distribution column value: test +PREPARE null_update_on_text_param_and_in_4(text) AS UPDATE text_dist_column SET value = '' WHERE key IN ($1) and false; +EXECUTE null_update_on_text_param_and_in_4(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable +EXECUTE null_update_on_text_param_and_in_4(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable +EXECUTE null_update_on_text_param_and_in_4(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable +EXECUTE null_update_on_text_param_and_in_4(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable +EXECUTE null_update_on_text_param_and_in_4(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable +EXECUTE null_update_on_text_param_and_in_4(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable +EXECUTE null_update_on_text_param_and_in_4(NULL); +-- sanity check with JSBONB column +CREATE TABLE jsonb_dist_column (key jsonb, value text); +DEBUG: building index "pg_toast_xxxxx_index" on table "pg_toast_xxxxx" serially +SELECT create_distributed_table('jsonb_dist_column', 'key'); + create_distributed_table +--------------------------------------------------------------------- + +(1 row) + +PREPARE null_select_on_json_param(jsonb) AS SELECT count(*) FROM jsonb_dist_column WHERE key = $1; +EXECUTE null_select_on_json_param(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_json_param(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_json_param(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_json_param(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_json_param(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_json_param(NULL); +DEBUG: Deferred pruning for a fast-path router query +DEBUG: Creating router plan +DEBUG: Plan is router executable + count +--------------------------------------------------------------------- + 0 +(1 row) + +EXECUTE null_select_on_json_param(NULL); + count +--------------------------------------------------------------------- + 0 +(1 row) + +SET client_min_messages TO ERROR; +DROP SCHEMA null_parameters CASCADE; diff --git a/src/test/regress/multi_schedule b/src/test/regress/multi_schedule index 1b50e21c5..e75bde7e2 100644 --- a/src/test/regress/multi_schedule +++ b/src/test/regress/multi_schedule @@ -201,7 +201,7 @@ test: multi_transaction_recovery # multi_router_planner creates hash partitioned tables. # --------- test: multi_copy fast_path_router_modify -test: multi_router_planner multi_router_planner_fast_path +test: multi_router_planner multi_router_planner_fast_path null_parameters # ---------- # multi_large_shardid loads more lineitem data using high shard identifiers diff --git a/src/test/regress/sql/multi_router_planner_fast_path.sql b/src/test/regress/sql/multi_router_planner_fast_path.sql index 05879f363..542ead437 100644 --- a/src/test/regress/sql/multi_router_planner_fast_path.sql +++ b/src/test/regress/sql/multi_router_planner_fast_path.sql @@ -666,6 +666,25 @@ EXECUTE author_articles(1); EXECUTE author_articles(1); EXECUTE author_articles(1); +EXECUTE author_articles(NULL); +EXECUTE author_articles(NULL); +EXECUTE author_articles(NULL); +EXECUTE author_articles(NULL); +EXECUTE author_articles(NULL); +EXECUTE author_articles(NULL); +EXECUTE author_articles(NULL); + +PREPARE author_articles_update(int) AS + UPDATE articles_hash SET title = 'test' WHERE author_id = $1; + +EXECUTE author_articles_update(NULL); +EXECUTE author_articles_update(NULL); +EXECUTE author_articles_update(NULL); +EXECUTE author_articles_update(NULL); +EXECUTE author_articles_update(NULL); +EXECUTE author_articles_update(NULL); +EXECUTE author_articles_update(NULL); + -- queries inside plpgsql functions could be router plannable CREATE OR REPLACE FUNCTION author_articles_max_id() RETURNS int AS $$ DECLARE diff --git a/src/test/regress/sql/null_parameters.sql b/src/test/regress/sql/null_parameters.sql new file mode 100644 index 000000000..bb2d8fc9f --- /dev/null +++ b/src/test/regress/sql/null_parameters.sql @@ -0,0 +1,315 @@ +-- this file contain tests with pruning of NULL +-- values with prepared statements +CREATE SCHEMA null_parameters; +SET search_path TO null_parameters; + +SET citus.next_shard_id TO 1680000; +CREATE TABLE text_dist_column (key text, value text); +SELECT create_distributed_table('text_dist_column', 'key'); + +SET client_min_messages TO DEBUG; + + +PREPARE null_select_on_text AS SELECT count(*) FROM text_dist_column WHERE key = NULL; +EXECUTE null_select_on_text; +EXECUTE null_select_on_text; +EXECUTE null_select_on_text; +EXECUTE null_select_on_text; +EXECUTE null_select_on_text; +EXECUTE null_select_on_text; + +PREPARE null_select_on_text_param(text) AS SELECT count(*) FROM text_dist_column WHERE key = $1; +EXECUTE null_select_on_text_param(NULL); +EXECUTE null_select_on_text_param(NULL); +EXECUTE null_select_on_text_param(5::text); +EXECUTE null_select_on_text_param(NULL); +EXECUTE null_select_on_text_param(NULL); +EXECUTE null_select_on_text_param(NULL); +EXECUTE null_select_on_text_param(NULL); +EXECUTE null_select_on_text_param(NULL); +EXECUTE null_select_on_text_param(NULL::varchar); +EXECUTE null_select_on_text_param('test'::varchar); +EXECUTE null_select_on_text_param(5::text); + +PREPARE null_select_on_text_param_and_false(text) AS SELECT count(*) FROM text_dist_column WHERE key = $1 AND false; +EXECUTE null_select_on_text_param_and_false(NULL); +EXECUTE null_select_on_text_param_and_false(NULL); +EXECUTE null_select_on_text_param_and_false(NULL); +EXECUTE null_select_on_text_param_and_false(NULL); +EXECUTE null_select_on_text_param_and_false(NULL); +EXECUTE null_select_on_text_param_and_false(NULL); +EXECUTE null_select_on_text_param_and_false(NULL); + +PREPARE null_select_on_text_param_and_in(text) AS SELECT count(*) FROM text_dist_column WHERE key IN ($1); +EXECUTE null_select_on_text_param_and_in(NULL); +EXECUTE null_select_on_text_param_and_in(NULL); +EXECUTE null_select_on_text_param_and_in(NULL); +EXECUTE null_select_on_text_param_and_in(NULL); +EXECUTE null_select_on_text_param_and_in(NULL); +EXECUTE null_select_on_text_param_and_in(NULL); + +PREPARE null_select_on_text_param_and_in_2(text) AS SELECT count(*) FROM text_dist_column WHERE key IN ($1, 'test'); +EXECUTE null_select_on_text_param_and_in_2(NULL); +EXECUTE null_select_on_text_param_and_in_2(NULL); +EXECUTE null_select_on_text_param_and_in_2(NULL); +EXECUTE null_select_on_text_param_and_in_2(NULL); +EXECUTE null_select_on_text_param_and_in_2(NULL); +EXECUTE null_select_on_text_param_and_in_2(NULL); + +PREPARE null_select_on_text_param_and_in_3(text, text) AS SELECT count(*) FROM text_dist_column WHERE key IN ($1, $2); +EXECUTE null_select_on_text_param_and_in_3(NULL, NULL); +EXECUTE null_select_on_text_param_and_in_3(NULL, NULL); +EXECUTE null_select_on_text_param_and_in_3(NULL, NULL); +EXECUTE null_select_on_text_param_and_in_3(NULL, NULL); +EXECUTE null_select_on_text_param_and_in_3(NULL, NULL); +EXECUTE null_select_on_text_param_and_in_3(NULL, NULL); + + +PREPARE null_select_on_text_param_and_in_4(text) AS SELECT count(*) FROM text_dist_column WHERE key IN ($1) AND false; +EXECUTE null_select_on_text_param_and_in_4(NULL); +EXECUTE null_select_on_text_param_and_in_4(NULL); +EXECUTE null_select_on_text_param_and_in_4(NULL); +EXECUTE null_select_on_text_param_and_in_4(NULL); +EXECUTE null_select_on_text_param_and_in_4(NULL); +EXECUTE null_select_on_text_param_and_in_4(NULL); + +-- not a fast-path, still good to run +PREPARE null_select_on_text_param_and_in_5(text, text) AS SELECT count(*) FROM text_dist_column WHERE key = $1 OR key = $2; +EXECUTE null_select_on_text_param_and_in_5(NULL, NULL); +EXECUTE null_select_on_text_param_and_in_5(NULL, NULL); +EXECUTE null_select_on_text_param_and_in_5(1, NULL); +EXECUTE null_select_on_text_param_and_in_5(NULL, NULL); +EXECUTE null_select_on_text_param_and_in_5(NULL, NULL); +EXECUTE null_select_on_text_param_and_in_5(NULL, NULL); +EXECUTE null_select_on_text_param_and_in_5(NULL, NULL); +EXECUTE null_select_on_text_param_and_in_5(NULL, NULL); +EXECUTE null_select_on_text_param_and_in_5(1, NULL); + +-- not a fast-path, still good to have +PREPARE null_select_on_text_param_and_in_6(text) AS SELECT count(*) FROM text_dist_column WHERE key NOT IN (SELECT value FROM text_dist_column WHERE key = $1); +EXECUTE null_select_on_text_param_and_in_6(NULL); +EXECUTE null_select_on_text_param_and_in_6(NULL); +EXECUTE null_select_on_text_param_and_in_6(NULL); +EXECUTE null_select_on_text_param_and_in_6(NULL); +EXECUTE null_select_on_text_param_and_in_6(NULL); +EXECUTE null_select_on_text_param_and_in_6(NULL); +EXECUTE null_select_on_text_param_and_in_6(NULL); + +-- different expression types which may not be fast-path queries +PREPARE null_select_on_text_param_7(text) AS SELECT count(*) FROM text_dist_column WHERE (key = $1) is true; +EXECUTE null_select_on_text_param_7(NULL); +EXECUTE null_select_on_text_param_7(NULL); +EXECUTE null_select_on_text_param_7(NULL); +EXECUTE null_select_on_text_param_7(NULL); +EXECUTE null_select_on_text_param_7(NULL); +EXECUTE null_select_on_text_param_7(NULL); +EXECUTE null_select_on_text_param_7(NULL); + +-- different expression types which may not be fast-path queries +PREPARE null_select_on_text_param_8(text) AS SELECT count(*) FROM text_dist_column WHERE key = ANY(ARRAY[$1]); +EXECUTE null_select_on_text_param_8(NULL); +EXECUTE null_select_on_text_param_8(NULL); +EXECUTE null_select_on_text_param_8(NULL); +EXECUTE null_select_on_text_param_8(NULL); +EXECUTE null_select_on_text_param_8(NULL); +EXECUTE null_select_on_text_param_8(NULL); +EXECUTE null_select_on_text_param_8(NULL); + + +PREPARE null_select_on_text_param_9(text) AS SELECT count(*) FROM text_dist_column WHERE key = ANY(ARRAY[$1, 'test']); +EXECUTE null_select_on_text_param_9(NULL); +EXECUTE null_select_on_text_param_9(NULL); +EXECUTE null_select_on_text_param_9(NULL); +EXECUTE null_select_on_text_param_9(NULL); +EXECUTE null_select_on_text_param_9(NULL); +EXECUTE null_select_on_text_param_9(NULL); +EXECUTE null_select_on_text_param_9(NULL); + +-- different expression types which may not be fast-path queries +PREPARE null_select_on_text_param_10(text) AS SELECT count(*) FROM text_dist_column WHERE key = ALL(ARRAY[$1]); +EXECUTE null_select_on_text_param_10(NULL); +EXECUTE null_select_on_text_param_10(NULL); +EXECUTE null_select_on_text_param_10(NULL); +EXECUTE null_select_on_text_param_10(NULL); +EXECUTE null_select_on_text_param_10(NULL); +EXECUTE null_select_on_text_param_10(NULL); +EXECUTE null_select_on_text_param_10(NULL); + +-- different expression types which may not be fast-path queries +PREPARE null_select_on_text_param_11(text) AS SELECT count(*) FROM text_dist_column WHERE (CASE WHEN key > $1 THEN key::int / 100 > 1 ELSE false END); +EXECUTE null_select_on_text_param_11(NULL); +EXECUTE null_select_on_text_param_11(NULL); +EXECUTE null_select_on_text_param_11(NULL); +EXECUTE null_select_on_text_param_11(NULL); +EXECUTE null_select_on_text_param_11(NULL); +EXECUTE null_select_on_text_param_11(NULL); +EXECUTE null_select_on_text_param_11(NULL); +EXECUTE null_select_on_text_param_11(NULL); + +-- different expression types which may not be fast-path queries +PREPARE null_select_on_text_param_12(text) AS SELECT count(*) FROM text_dist_column WHERE COALESCE(($1::int/50000)::bool, false); + +EXECUTE null_select_on_text_param_12(NULL); +EXECUTE null_select_on_text_param_12(NULL); +EXECUTE null_select_on_text_param_12(NULL); +EXECUTE null_select_on_text_param_12(NULL); +EXECUTE null_select_on_text_param_12(NULL); +EXECUTE null_select_on_text_param_12(NULL); +EXECUTE null_select_on_text_param_12(NULL); + +-- different expression types which may not be fast-path queries +PREPARE null_select_on_text_param_13(text) AS SELECT count(*) FROM text_dist_column WHERE NULLIF(($1::int/50000)::bool, false); + +EXECUTE null_select_on_text_param_13(NULL); +EXECUTE null_select_on_text_param_13(NULL); +EXECUTE null_select_on_text_param_13(NULL); +EXECUTE null_select_on_text_param_13(NULL); +EXECUTE null_select_on_text_param_13(NULL); +EXECUTE null_select_on_text_param_13(NULL); +EXECUTE null_select_on_text_param_13(NULL); + +PREPARE null_select_on_text_param_14(text) AS SELECT count(*) FROM text_dist_column WHERE key = $1 AND 0!=0; +EXECUTE null_select_on_text_param_14(NULL); +EXECUTE null_select_on_text_param_14(NULL); +EXECUTE null_select_on_text_param_14(NULL); +EXECUTE null_select_on_text_param_14(NULL); +EXECUTE null_select_on_text_param_14(NULL); +EXECUTE null_select_on_text_param_14(NULL); +EXECUTE null_select_on_text_param_14(NULL); +EXECUTE null_select_on_text_param_14(NULL); + +PREPARE null_select_on_text_param_15(text) AS SELECT count(*) FROM text_dist_column WHERE row(key, 100) > row($1, 0); +EXECUTE null_select_on_text_param_15(NULL); +EXECUTE null_select_on_text_param_15(NULL); +EXECUTE null_select_on_text_param_15(NULL); +EXECUTE null_select_on_text_param_15(NULL); +EXECUTE null_select_on_text_param_15(NULL); +EXECUTE null_select_on_text_param_15(NULL); +EXECUTE null_select_on_text_param_15(NULL); +EXECUTE null_select_on_text_param_15(NULL); + + +PREPARE null_select_on_text_param_16(text) AS SELECT count(*) FROM text_dist_column WHERE key IS DISTINCT FROM $1; +EXECUTE null_select_on_text_param_16(NULL); +EXECUTE null_select_on_text_param_16(NULL); +EXECUTE null_select_on_text_param_16(NULL); +EXECUTE null_select_on_text_param_16(NULL); +EXECUTE null_select_on_text_param_16(NULL); +EXECUTE null_select_on_text_param_16(NULL); +EXECUTE null_select_on_text_param_16(NULL); +EXECUTE null_select_on_text_param_16(NULL); + + + +PREPARE null_select_on_text_param_17(text) AS SELECT count(*) FROM text_dist_column WHERE key = $1 AND 0!=1; +EXECUTE null_select_on_text_param_17(NULL); +EXECUTE null_select_on_text_param_17(NULL); +EXECUTE null_select_on_text_param_17(NULL); +EXECUTE null_select_on_text_param_17(NULL); +EXECUTE null_select_on_text_param_17(NULL); +EXECUTE null_select_on_text_param_17(NULL); +EXECUTE null_select_on_text_param_17(NULL); +EXECUTE null_select_on_text_param_17(NULL); + +PREPARE null_select_on_text_param_18(text) AS SELECT count(*) FROM text_dist_column WHERE key = upper($1); +EXECUTE null_select_on_text_param_18(NULL); +EXECUTE null_select_on_text_param_18(NULL); +EXECUTE null_select_on_text_param_18(NULL); +EXECUTE null_select_on_text_param_18(NULL); +EXECUTE null_select_on_text_param_18(NULL); +EXECUTE null_select_on_text_param_18(NULL); +EXECUTE null_select_on_text_param_18(NULL); + +PREPARE null_select_on_text_param_19(text) AS SELECT count(*) FROM text_dist_column WHERE key = $1::varchar(4); +EXECUTE null_select_on_text_param_19(NULL); +EXECUTE null_select_on_text_param_19(NULL); +EXECUTE null_select_on_text_param_19(NULL); +EXECUTE null_select_on_text_param_19(NULL); +EXECUTE null_select_on_text_param_19(NULL); +EXECUTE null_select_on_text_param_19(NULL); +EXECUTE null_select_on_text_param_19(NULL); + + +PREPARE null_update_on_text AS UPDATE text_dist_column SET value = '' WHERE key = NULL; +EXECUTE null_update_on_text(NULL); +EXECUTE null_update_on_text(NULL); +EXECUTE null_update_on_text(NULL); +EXECUTE null_update_on_text(NULL); +EXECUTE null_update_on_text(NULL); +EXECUTE null_update_on_text(NULL); + + +PREPARE null_update_on_text_param(text) AS UPDATE text_dist_column SET value = '' WHERE key = $1; +EXECUTE null_update_on_text_param(NULL); +EXECUTE null_update_on_text_param(NULL); +EXECUTE null_update_on_text_param(NULL); +EXECUTE null_update_on_text_param(NULL); +EXECUTE null_update_on_text_param(NULL); +EXECUTE null_update_on_text_param(NULL); +EXECUTE null_update_on_text_param(NULL); + + +PREPARE null_update_on_text_param_and_false(text) AS UPDATE text_dist_column SET value = '' WHERE key = $1 AND false; +EXECUTE null_update_on_text_param_and_false(NULL); +EXECUTE null_update_on_text_param_and_false(NULL); +EXECUTE null_update_on_text_param_and_false(NULL); +EXECUTE null_update_on_text_param_and_false(NULL); +EXECUTE null_update_on_text_param_and_false(NULL); +EXECUTE null_update_on_text_param_and_false(NULL); +EXECUTE null_update_on_text_param_and_false(NULL); + + + +PREPARE null_update_on_text_param_and_in(text) AS UPDATE text_dist_column SET value = '' WHERE key IN ($1); +EXECUTE null_update_on_text_param_and_in(NULL); +EXECUTE null_update_on_text_param_and_in(NULL); +EXECUTE null_update_on_text_param_and_in(NULL); +EXECUTE null_update_on_text_param_and_in(NULL); +EXECUTE null_update_on_text_param_and_in(NULL); +EXECUTE null_update_on_text_param_and_in(NULL); +EXECUTE null_update_on_text_param_and_in(NULL); + + + +PREPARE null_update_on_text_param_and_in_2(text) AS UPDATE text_dist_column SET value = '' WHERE key IN ($1, 'test'); +EXECUTE null_update_on_text_param_and_in_2(NULL); +EXECUTE null_update_on_text_param_and_in_2(NULL); +EXECUTE null_update_on_text_param_and_in_2(NULL); +EXECUTE null_update_on_text_param_and_in_2(NULL); +EXECUTE null_update_on_text_param_and_in_2(NULL); +EXECUTE null_update_on_text_param_and_in_2(NULL); +EXECUTE null_update_on_text_param_and_in_2(NULL); + + +PREPARE null_update_on_text_param_and_in_3(text, text) AS UPDATE text_dist_column SET value = '' WHERE key IN ($1, $2); +EXECUTE null_update_on_text_param_and_in_3(NULL, NULL); +EXECUTE null_update_on_text_param_and_in_3(NULL, NULL); +EXECUTE null_update_on_text_param_and_in_3(NULL, NULL); +EXECUTE null_update_on_text_param_and_in_3(NULL, NULL); +EXECUTE null_update_on_text_param_and_in_3(NULL, NULL); +EXECUTE null_update_on_text_param_and_in_3(NULL, NULL); +EXECUTE null_update_on_text_param_and_in_3(NULL, 'test'); + +PREPARE null_update_on_text_param_and_in_4(text) AS UPDATE text_dist_column SET value = '' WHERE key IN ($1) and false; +EXECUTE null_update_on_text_param_and_in_4(NULL); +EXECUTE null_update_on_text_param_and_in_4(NULL); +EXECUTE null_update_on_text_param_and_in_4(NULL); +EXECUTE null_update_on_text_param_and_in_4(NULL); +EXECUTE null_update_on_text_param_and_in_4(NULL); +EXECUTE null_update_on_text_param_and_in_4(NULL); +EXECUTE null_update_on_text_param_and_in_4(NULL); + +-- sanity check with JSBONB column +CREATE TABLE jsonb_dist_column (key jsonb, value text); +SELECT create_distributed_table('jsonb_dist_column', 'key'); +PREPARE null_select_on_json_param(jsonb) AS SELECT count(*) FROM jsonb_dist_column WHERE key = $1; +EXECUTE null_select_on_json_param(NULL); +EXECUTE null_select_on_json_param(NULL); +EXECUTE null_select_on_json_param(NULL); +EXECUTE null_select_on_json_param(NULL); +EXECUTE null_select_on_json_param(NULL); +EXECUTE null_select_on_json_param(NULL); +EXECUTE null_select_on_json_param(NULL); + +SET client_min_messages TO ERROR; +DROP SCHEMA null_parameters CASCADE;