diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2000-09-15 18:45:31 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2000-09-15 18:45:31 +0000 |
commit | 8ae9ad1cb8cfcaa929322ee3df48094f5ffd96e9 (patch) | |
tree | e72ebab2801d58150f1ce72f488e005ab23854ba /src/backend/optimizer/path/indxpath.c | |
parent | 148f905f4185bbad191bceba5e7a173b38e7d3ba (diff) | |
download | postgresql-8ae9ad1cb8cfcaa929322ee3df48094f5ffd96e9.tar.gz postgresql-8ae9ad1cb8cfcaa929322ee3df48094f5ffd96e9.zip |
Reimplement LIKE/ESCAPE as operators so that indexscan optimization
can still work, per recent discussion on pghackers. Correct some bugs
in ILIKE implementation.
Diffstat (limited to 'src/backend/optimizer/path/indxpath.c')
-rw-r--r-- | src/backend/optimizer/path/indxpath.c | 42 |
1 files changed, 41 insertions, 1 deletions
diff --git a/src/backend/optimizer/path/indxpath.c b/src/backend/optimizer/path/indxpath.c index 3156a951314..55bbd5f5983 100644 --- a/src/backend/optimizer/path/indxpath.c +++ b/src/backend/optimizer/path/indxpath.c @@ -9,7 +9,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/optimizer/path/indxpath.c,v 1.95 2000/09/12 21:06:53 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/optimizer/path/indxpath.c,v 1.96 2000/09/15 18:45:25 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -1755,6 +1755,20 @@ match_special_index_operator(Expr *clause, Oid opclass, Oid relam, pfree(patt); break; + case OID_TEXT_ICLIKE_OP: + case OID_BPCHAR_ICLIKE_OP: + case OID_VARCHAR_ICLIKE_OP: + case OID_NAME_ICLIKE_OP: + /* the right-hand const is type text for all of these */ + patt = DatumGetCString(DirectFunctionCall1(textout, + constvalue)); + isIndexable = pattern_fixed_prefix(patt, Pattern_Type_Like_IC, + &prefix, &rest) != Pattern_Prefix_None; + if (prefix) + pfree(prefix); + pfree(patt); + break; + case OID_TEXT_REGEXEQ_OP: case OID_BPCHAR_REGEXEQ_OP: case OID_VARCHAR_REGEXEQ_OP: @@ -1797,6 +1811,7 @@ match_special_index_operator(Expr *clause, Oid opclass, Oid relam, switch (expr_op) { case OID_TEXT_LIKE_OP: + case OID_TEXT_ICLIKE_OP: case OID_TEXT_REGEXEQ_OP: case OID_TEXT_ICREGEXEQ_OP: if (!op_class(find_operator(">=", TEXTOID), opclass, relam) || @@ -1805,6 +1820,7 @@ match_special_index_operator(Expr *clause, Oid opclass, Oid relam, break; case OID_BPCHAR_LIKE_OP: + case OID_BPCHAR_ICLIKE_OP: case OID_BPCHAR_REGEXEQ_OP: case OID_BPCHAR_ICREGEXEQ_OP: if (!op_class(find_operator(">=", BPCHAROID), opclass, relam) || @@ -1813,6 +1829,7 @@ match_special_index_operator(Expr *clause, Oid opclass, Oid relam, break; case OID_VARCHAR_LIKE_OP: + case OID_VARCHAR_ICLIKE_OP: case OID_VARCHAR_REGEXEQ_OP: case OID_VARCHAR_ICREGEXEQ_OP: if (!op_class(find_operator(">=", VARCHAROID), opclass, relam) || @@ -1821,6 +1838,7 @@ match_special_index_operator(Expr *clause, Oid opclass, Oid relam, break; case OID_NAME_LIKE_OP: + case OID_NAME_ICLIKE_OP: case OID_NAME_REGEXEQ_OP: case OID_NAME_ICREGEXEQ_OP: if (!op_class(find_operator(">=", NAMEOID), opclass, relam) || @@ -1887,6 +1905,24 @@ expand_indexqual_conditions(List *indexquals) pfree(patt); break; + case OID_TEXT_ICLIKE_OP: + case OID_BPCHAR_ICLIKE_OP: + case OID_VARCHAR_ICLIKE_OP: + case OID_NAME_ICLIKE_OP: + /* the right-hand const is type text for all of these */ + constvalue = ((Const *) rightop)->constvalue; + patt = DatumGetCString(DirectFunctionCall1(textout, + constvalue)); + pstatus = pattern_fixed_prefix(patt, Pattern_Type_Like_IC, + &prefix, &rest); + resultquals = nconc(resultquals, + prefix_quals(leftop, expr_op, + prefix, pstatus)); + if (prefix) + pfree(prefix); + pfree(patt); + break; + case OID_TEXT_REGEXEQ_OP: case OID_BPCHAR_REGEXEQ_OP: case OID_VARCHAR_REGEXEQ_OP: @@ -1955,24 +1991,28 @@ prefix_quals(Var *leftop, Oid expr_op, switch (expr_op) { case OID_TEXT_LIKE_OP: + case OID_TEXT_ICLIKE_OP: case OID_TEXT_REGEXEQ_OP: case OID_TEXT_ICREGEXEQ_OP: datatype = TEXTOID; break; case OID_BPCHAR_LIKE_OP: + case OID_BPCHAR_ICLIKE_OP: case OID_BPCHAR_REGEXEQ_OP: case OID_BPCHAR_ICREGEXEQ_OP: datatype = BPCHAROID; break; case OID_VARCHAR_LIKE_OP: + case OID_VARCHAR_ICLIKE_OP: case OID_VARCHAR_REGEXEQ_OP: case OID_VARCHAR_ICREGEXEQ_OP: datatype = VARCHAROID; break; case OID_NAME_LIKE_OP: + case OID_NAME_ICLIKE_OP: case OID_NAME_REGEXEQ_OP: case OID_NAME_ICREGEXEQ_OP: datatype = NAMEOID; |