99 *
1010 *
1111 * IDENTIFICATION
12- * $Header: /cvsroot/pgsql/src/backend/optimizer/path/indxpath.c,v 1.137 2003/05/13 04:38:58 tgl Exp $
12+ * $Header: /cvsroot/pgsql/src/backend/optimizer/path/indxpath.c,v 1.138 2003/05/15 15:50:18 petere Exp $
1313 *
1414 *-------------------------------------------------------------------------
1515 */
@@ -1797,44 +1797,40 @@ match_special_index_operator(Expr *clause, Oid opclass,
17971797case OID_VARCHAR_LIKE_OP :
17981798case OID_NAME_LIKE_OP :
17991799/* the right-hand const is type text for all of these */
1800- if (locale_is_like_safe ())
1801- isIndexable = pattern_fixed_prefix (patt ,Pattern_Type_Like ,
1802- & prefix ,& rest )!= Pattern_Prefix_None ;
1800+ isIndexable = pattern_fixed_prefix (patt ,Pattern_Type_Like ,
1801+ & prefix ,& rest )!= Pattern_Prefix_None ;
18031802break ;
18041803
18051804case OID_BYTEA_LIKE_OP :
18061805isIndexable = pattern_fixed_prefix (patt ,Pattern_Type_Like ,
1807- & prefix ,& rest )!= Pattern_Prefix_None ;
1806+ & prefix ,& rest )!= Pattern_Prefix_None ;
18081807break ;
18091808
18101809case OID_TEXT_ICLIKE_OP :
18111810case OID_BPCHAR_ICLIKE_OP :
18121811case OID_VARCHAR_ICLIKE_OP :
18131812case OID_NAME_ICLIKE_OP :
18141813/* the right-hand const is type text for all of these */
1815- if (locale_is_like_safe ())
1816- isIndexable = pattern_fixed_prefix (patt ,Pattern_Type_Like_IC ,
1817- & prefix ,& rest )!= Pattern_Prefix_None ;
1814+ isIndexable = pattern_fixed_prefix (patt ,Pattern_Type_Like_IC ,
1815+ & prefix ,& rest )!= Pattern_Prefix_None ;
18181816break ;
18191817
18201818case OID_TEXT_REGEXEQ_OP :
18211819case OID_BPCHAR_REGEXEQ_OP :
18221820case OID_VARCHAR_REGEXEQ_OP :
18231821case OID_NAME_REGEXEQ_OP :
18241822/* the right-hand const is type text for all of these */
1825- if (locale_is_like_safe ())
1826- isIndexable = pattern_fixed_prefix (patt ,Pattern_Type_Regex ,
1827- & prefix ,& rest )!= Pattern_Prefix_None ;
1823+ isIndexable = pattern_fixed_prefix (patt ,Pattern_Type_Regex ,
1824+ & prefix ,& rest )!= Pattern_Prefix_None ;
18281825break ;
18291826
18301827case OID_TEXT_ICREGEXEQ_OP :
18311828case OID_BPCHAR_ICREGEXEQ_OP :
18321829case OID_VARCHAR_ICREGEXEQ_OP :
18331830case OID_NAME_ICREGEXEQ_OP :
18341831/* the right-hand const is type text for all of these */
1835- if (locale_is_like_safe ())
1836- isIndexable = pattern_fixed_prefix (patt ,Pattern_Type_Regex_IC ,
1837- & prefix ,& rest )!= Pattern_Prefix_None ;
1832+ isIndexable = pattern_fixed_prefix (patt ,Pattern_Type_Regex_IC ,
1833+ & prefix ,& rest )!= Pattern_Prefix_None ;
18381834break ;
18391835
18401836case OID_INET_SUB_OP :
@@ -1867,42 +1863,53 @@ match_special_index_operator(Expr *clause, Oid opclass,
18671863case OID_TEXT_ICLIKE_OP :
18681864case OID_TEXT_REGEXEQ_OP :
18691865case OID_TEXT_ICREGEXEQ_OP :
1870- if (!op_in_opclass (find_operator (">=" ,TEXTOID ),opclass )||
1871- !op_in_opclass (find_operator ("<" ,TEXTOID ),opclass ))
1872- isIndexable = false;
1866+ if (lc_collate_is_c ())
1867+ isIndexable = (op_in_opclass (find_operator (">=" ,TEXTOID ),opclass )
1868+ && op_in_opclass (find_operator ("<" ,TEXTOID ),opclass ));
1869+ else
1870+ isIndexable = (op_in_opclass (find_operator ("~>=~" ,TEXTOID ),opclass )
1871+ && op_in_opclass (find_operator ("~<~" ,TEXTOID ),opclass ));
18731872break ;
18741873
18751874case OID_BYTEA_LIKE_OP :
1876- if (!op_in_opclass (find_operator (">=" ,BYTEAOID ),opclass )||
1877- !op_in_opclass (find_operator ("<" ,BYTEAOID ),opclass ))
1878- isIndexable = false;
1875+ isIndexable = (op_in_opclass (find_operator (">=" ,BYTEAOID ),opclass )
1876+ && op_in_opclass (find_operator ("<" ,BYTEAOID ),opclass ));
18791877break ;
18801878
18811879case OID_BPCHAR_LIKE_OP :
18821880case OID_BPCHAR_ICLIKE_OP :
18831881case OID_BPCHAR_REGEXEQ_OP :
18841882case OID_BPCHAR_ICREGEXEQ_OP :
1885- if (!op_in_opclass (find_operator (">=" ,BPCHAROID ),opclass )||
1886- !op_in_opclass (find_operator ("<" ,BPCHAROID ),opclass ))
1887- isIndexable = false;
1883+ if (lc_collate_is_c ())
1884+ isIndexable = (op_in_opclass (find_operator (">=" ,BPCHAROID ),opclass )
1885+ && op_in_opclass (find_operator ("<" ,BPCHAROID ),opclass ));
1886+ else
1887+ isIndexable = (op_in_opclass (find_operator ("~>=~" ,BPCHAROID ),opclass )
1888+ && op_in_opclass (find_operator ("~<~" ,BPCHAROID ),opclass ));
18881889break ;
18891890
18901891case OID_VARCHAR_LIKE_OP :
18911892case OID_VARCHAR_ICLIKE_OP :
18921893case OID_VARCHAR_REGEXEQ_OP :
18931894case OID_VARCHAR_ICREGEXEQ_OP :
1894- if (!op_in_opclass (find_operator (">=" ,VARCHAROID ),opclass )||
1895- !op_in_opclass (find_operator ("<" ,VARCHAROID ),opclass ))
1896- isIndexable = false;
1895+ if (lc_collate_is_c ())
1896+ isIndexable = (op_in_opclass (find_operator (">=" ,VARCHAROID ),opclass )
1897+ && op_in_opclass (find_operator ("<" ,VARCHAROID ),opclass ));
1898+ else
1899+ isIndexable = (op_in_opclass (find_operator ("~>=~" ,VARCHAROID ),opclass )
1900+ && op_in_opclass (find_operator ("~<~" ,VARCHAROID ),opclass ));
18971901break ;
18981902
18991903case OID_NAME_LIKE_OP :
19001904case OID_NAME_ICLIKE_OP :
19011905case OID_NAME_REGEXEQ_OP :
19021906case OID_NAME_ICREGEXEQ_OP :
1903- if (!op_in_opclass (find_operator (">=" ,NAMEOID ),opclass )||
1904- !op_in_opclass (find_operator ("<" ,NAMEOID ),opclass ))
1905- isIndexable = false;
1907+ if (lc_collate_is_c ())
1908+ isIndexable = (op_in_opclass (find_operator (">=" ,NAMEOID ),opclass )
1909+ && op_in_opclass (find_operator ("<" ,NAMEOID ),opclass ));
1910+ else
1911+ isIndexable = (op_in_opclass (find_operator ("~>=~" ,NAMEOID ),opclass )
1912+ && op_in_opclass (find_operator ("~<~" ,NAMEOID ),opclass ));
19061913break ;
19071914
19081915case OID_INET_SUB_OP :
@@ -2039,6 +2046,7 @@ prefix_quals(Node *leftop, Oid expr_op,
20392046List * result ;
20402047Oid datatype ;
20412048Oid oproid ;
2049+ const char * oprname ;
20422050char * prefix ;
20432051Const * con ;
20442052Expr * expr ;
@@ -2098,9 +2106,10 @@ prefix_quals(Node *leftop, Oid expr_op,
20982106 */
20992107if (pstatus == Pattern_Prefix_Exact )
21002108{
2101- oproid = find_operator ("=" ,datatype );
2109+ oprname = (datatype == BYTEAOID || lc_collate_is_c () ?"=" :"~=~" );
2110+ oproid = find_operator (oprname ,datatype );
21022111if (oproid == InvalidOid )
2103- elog (ERROR ,"prefix_quals: no= operator for type %u" ,datatype );
2112+ elog (ERROR ,"prefix_quals: no operator%s for type %u" , oprname ,datatype );
21042113con = string_to_const (prefix ,datatype );
21052114expr = make_opclause (oproid ,BOOLOID , false,
21062115 (Expr * )leftop , (Expr * )con );
@@ -2113,9 +2122,10 @@ prefix_quals(Node *leftop, Oid expr_op,
21132122 *
21142123 * We can always say "x >= prefix".
21152124 */
2116- oproid = find_operator (">=" ,datatype );
2125+ oprname = (datatype == BYTEAOID || lc_collate_is_c () ?">=" :"~>=~" );
2126+ oproid = find_operator (oprname ,datatype );
21172127if (oproid == InvalidOid )
2118- elog (ERROR ,"prefix_quals: no>= operator for type %u" ,datatype );
2128+ elog (ERROR ,"prefix_quals: no operator%s for type %u" , oprname ,datatype );
21192129con = string_to_const (prefix ,datatype );
21202130expr = make_opclause (oproid ,BOOLOID , false,
21212131 (Expr * )leftop , (Expr * )con );
@@ -2129,9 +2139,10 @@ prefix_quals(Node *leftop, Oid expr_op,
21292139greaterstr = make_greater_string (con );
21302140if (greaterstr )
21312141{
2132- oproid = find_operator ("<" ,datatype );
2142+ oprname = (datatype == BYTEAOID || lc_collate_is_c () ?"<" :"~<~" );
2143+ oproid = find_operator (oprname ,datatype );
21332144if (oproid == InvalidOid )
2134- elog (ERROR ,"prefix_quals: no< operator for type %u" ,datatype );
2145+ elog (ERROR ,"prefix_quals: no operator%s for type %u" , oprname ,datatype );
21352146expr = make_opclause (oproid ,BOOLOID , false,
21362147 (Expr * )leftop , (Expr * )greaterstr );
21372148result = lappend (result ,expr );