aboutsummaryrefslogtreecommitdiff
path: root/src/backend/parser/parse_oper.c
diff options
context:
space:
mode:
authorDavid Rowley <drowley@postgresql.org>2021-07-07 16:29:17 +1200
committerDavid Rowley <drowley@postgresql.org>2021-07-07 16:29:17 +1200
commit29f45e299e7ffa1df0db44b8452228625479487f (patch)
tree948f286a1db23d164aeb20d4cb3d172ed986e758 /src/backend/parser/parse_oper.c
parentd854720df6df68cfe1432342e33c9e3020572a51 (diff)
downloadpostgresql-29f45e299e7ffa1df0db44b8452228625479487f.tar.gz
postgresql-29f45e299e7ffa1df0db44b8452228625479487f.zip
Use a hash table to speed up NOT IN(values)
Similar to 50e17ad28, which allowed hash tables to be used for IN clauses with a set of constants, here we add the same feature for NOT IN clauses. NOT IN evaluates the same as: WHERE a <> v1 AND a <> v2 AND a <> v3. Obviously, if we're using a hash table we must be exactly equivalent to that and return the same result taking into account that either side of the condition could contain a NULL. This requires a little bit of special handling to make work with the hash table version. When processing NOT IN, the ScalarArrayOpExpr's operator will be the <> operator. To be able to build and lookup a hash table we must use the <>'s negator operator. The planner checks if that exists and is hashable and sets the relevant fields in ScalarArrayOpExpr to instruct the executor to use hashing. Author: David Rowley, James Coleman Reviewed-by: James Coleman, Zhihong Yu Discussion: https://postgr.es/m/CAApHDvoF1mum_FRk6D621edcB6KSHBi2+GAgWmioj5AhOu2vwQ@mail.gmail.com
Diffstat (limited to 'src/backend/parser/parse_oper.c')
-rw-r--r--src/backend/parser/parse_oper.c1
1 files changed, 1 insertions, 0 deletions
diff --git a/src/backend/parser/parse_oper.c b/src/backend/parser/parse_oper.c
index 4e460799903..bc34a23afc6 100644
--- a/src/backend/parser/parse_oper.c
+++ b/src/backend/parser/parse_oper.c
@@ -895,6 +895,7 @@ make_scalar_array_op(ParseState *pstate, List *opname,
result->opno = oprid(tup);
result->opfuncid = opform->oprcode;
result->hashfuncid = InvalidOid;
+ result->negfuncid = InvalidOid;
result->useOr = useOr;
/* inputcollid will be set by parse_collate.c */
result->args = args;