mirror of https://github.com/citusdata/citus.git
Merge pull request #3498 from citusdata/fix_null_crash
Do not prune shards if the distribution key is NULLpull/3499/head^2
commit
6225f37b91
|
|
@ -545,8 +545,8 @@ HandleDeferredShardPruningForFastPathQueries(DistributedPlan *distributedPlan)
|
||||||
bool isMultiShardQuery = false;
|
bool isMultiShardQuery = false;
|
||||||
List *shardIntervalList =
|
List *shardIntervalList =
|
||||||
TargetShardIntervalForFastPathQuery(workerJob->jobQuery,
|
TargetShardIntervalForFastPathQuery(workerJob->jobQuery,
|
||||||
&workerJob->partitionKeyValue,
|
&isMultiShardQuery, NULL,
|
||||||
&isMultiShardQuery, NULL);
|
&workerJob->partitionKeyValue);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* A fast-path router query can only yield multiple shards when the parameter
|
* A fast-path router query can only yield multiple shards when the parameter
|
||||||
|
|
|
||||||
|
|
@ -2091,8 +2091,9 @@ PlanRouterQuery(Query *originalQuery,
|
||||||
plannerRestrictionContext->fastPathRestrictionContext->distributionKeyValue;
|
plannerRestrictionContext->fastPathRestrictionContext->distributionKeyValue;
|
||||||
|
|
||||||
List *shardIntervalList =
|
List *shardIntervalList =
|
||||||
TargetShardIntervalForFastPathQuery(originalQuery, partitionValueConst,
|
TargetShardIntervalForFastPathQuery(originalQuery, &isMultiShardQuery,
|
||||||
&isMultiShardQuery, distributionKeyValue);
|
distributionKeyValue,
|
||||||
|
partitionValueConst);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This could only happen when there is a parameter on the distribution key.
|
* 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()
|
* one list of a a one shard interval (see FastPathRouterQuery()
|
||||||
* for the detail).
|
* for the detail).
|
||||||
*
|
*
|
||||||
* Also set the outgoing partition column value if requested via
|
* If the caller requested the distributionKey value that this function
|
||||||
* partitionValueConst
|
* yields, set outputPartitionValueConst.
|
||||||
*/
|
*/
|
||||||
List *
|
List *
|
||||||
TargetShardIntervalForFastPathQuery(Query *query, Const **partitionValueConst,
|
TargetShardIntervalForFastPathQuery(Query *query, bool *isMultiShardQuery,
|
||||||
bool *isMultiShardQuery, Const *distributionKeyValue)
|
Const *inputDistributionKeyValue,
|
||||||
|
Const **outputPartitionValueConst)
|
||||||
{
|
{
|
||||||
Oid relationId = ExtractFirstDistributedTableId(query);
|
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);
|
DistTableCacheEntry *cache = DistributedTableCacheEntry(relationId);
|
||||||
ShardInterval *shardInterval =
|
ShardInterval *shardInterval =
|
||||||
FindShardInterval(distributionKeyValue->constvalue, cache);
|
FindShardInterval(inputDistributionKeyValue->constvalue, cache);
|
||||||
|
|
||||||
if (partitionValueConst != NULL)
|
if (outputPartitionValueConst != NULL)
|
||||||
{
|
{
|
||||||
/* set the outgoing partition column value if requested */
|
/* set the outgoing partition column value if requested */
|
||||||
*partitionValueConst = distributionKeyValue;
|
*outputPartitionValueConst = inputDistributionKeyValue;
|
||||||
}
|
}
|
||||||
List *shardIntervalList = list_make1(shardInterval);
|
List *shardIntervalList = list_make1(shardInterval);
|
||||||
|
|
||||||
|
|
@ -2402,10 +2410,24 @@ TargetShardIntervalForFastPathQuery(Query *query, Const **partitionValueConst,
|
||||||
|
|
||||||
Node *quals = query->jointree->quals;
|
Node *quals = query->jointree->quals;
|
||||||
int relationIndex = 1;
|
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 =
|
List *prunedShardIntervalList =
|
||||||
PruneShards(relationId, relationIndex, make_ands_implicit((Expr *) quals),
|
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 */
|
/* we're only expecting single shard from a single table */
|
||||||
Node *distKey PG_USED_FOR_ASSERTS_ONLY = NULL;
|
Node *distKey PG_USED_FOR_ASSERTS_ONLY = NULL;
|
||||||
|
|
@ -2416,10 +2438,10 @@ TargetShardIntervalForFastPathQuery(Query *query, Const **partitionValueConst,
|
||||||
*isMultiShardQuery = true;
|
*isMultiShardQuery = true;
|
||||||
}
|
}
|
||||||
else if (list_length(prunedShardIntervalList) == 1 &&
|
else if (list_length(prunedShardIntervalList) == 1 &&
|
||||||
partitionValueConst != NULL)
|
outputPartitionValueConst != NULL)
|
||||||
{
|
{
|
||||||
/* set the outgoing partition column value if requested */
|
/* set the outgoing partition column value if requested */
|
||||||
*partitionValueConst = queryPartitionValueConst;
|
*outputPartitionValueConst = distributionKeyValueInQuals;
|
||||||
}
|
}
|
||||||
|
|
||||||
return list_make1(prunedShardIntervalList);
|
return list_make1(prunedShardIntervalList);
|
||||||
|
|
|
||||||
|
|
@ -749,13 +749,21 @@ AddPartitionKeyRestrictionToInstance(ClauseWalkerContext *context, OpExpr *opCla
|
||||||
constantClause);
|
constantClause);
|
||||||
if (constantClause == NULL)
|
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);
|
prune->otherRestrictions = lappend(prune->otherRestrictions, opClause);
|
||||||
|
|
||||||
return;
|
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 */
|
/* at this point, we'd better be able to pass binary Datums to comparison functions */
|
||||||
Assert(IsBinaryCoercible(constantClause->consttype, partitionColumn->vartype));
|
Assert(IsBinaryCoercible(constantClause->consttype, partitionColumn->vartype));
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -77,9 +77,9 @@ extern List * WorkersContainingAllShards(List *prunedShardIntervalsList);
|
||||||
|
|
||||||
extern uint64 GetAnchorShardId(List *relationShardList);
|
extern uint64 GetAnchorShardId(List *relationShardList);
|
||||||
extern List * TargetShardIntervalForFastPathQuery(Query *query,
|
extern List * TargetShardIntervalForFastPathQuery(Query *query,
|
||||||
Const **partitionValueConst,
|
|
||||||
bool *isMultiShardQuery,
|
bool *isMultiShardQuery,
|
||||||
Const *distributionKeyValue);
|
Const *inputDistributionKeyValue,
|
||||||
|
Const **outGoingPartitionValueConst);
|
||||||
extern void GenerateSingleShardRouterTaskList(Job *job,
|
extern void GenerateSingleShardRouterTaskList(Job *job,
|
||||||
List *relationShardList,
|
List *relationShardList,
|
||||||
List *placementList, uint64 shardId);
|
List *placementList, uint64 shardId);
|
||||||
|
|
|
||||||
|
|
@ -1636,6 +1636,68 @@ DEBUG: Plan is router executable
|
||||||
41 | 1 | aznavour | 11814
|
41 | 1 | aznavour | 11814
|
||||||
(5 rows)
|
(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
|
-- queries inside plpgsql functions could be router plannable
|
||||||
CREATE OR REPLACE FUNCTION author_articles_max_id() RETURNS int AS $$
|
CREATE OR REPLACE FUNCTION author_articles_max_id() RETURNS int AS $$
|
||||||
DECLARE
|
DECLARE
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -201,7 +201,7 @@ test: multi_transaction_recovery
|
||||||
# multi_router_planner creates hash partitioned tables.
|
# multi_router_planner creates hash partitioned tables.
|
||||||
# ---------
|
# ---------
|
||||||
test: multi_copy fast_path_router_modify
|
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
|
# multi_large_shardid loads more lineitem data using high shard identifiers
|
||||||
|
|
|
||||||
|
|
@ -666,6 +666,25 @@ EXECUTE author_articles(1);
|
||||||
EXECUTE author_articles(1);
|
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
|
-- queries inside plpgsql functions could be router plannable
|
||||||
CREATE OR REPLACE FUNCTION author_articles_max_id() RETURNS int AS $$
|
CREATE OR REPLACE FUNCTION author_articles_max_id() RETURNS int AS $$
|
||||||
DECLARE
|
DECLARE
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
Loading…
Reference in New Issue