indexable and locale - Mailing list pgsql-hackers
From | Goran Thyni |
---|---|
Subject | indexable and locale |
Date | |
Msg-id | 38076E23.DF48EB24@kirra.net Whole thread Raw |
Responses |
Re: [HACKERS] indexable and locale
Re: indexable and locale Re: indexable and locale |
List | pgsql-hackers |
Hello again, I thought I should start making some small contibutions before 7.0. Attached is a patch to the old problem discussed feverly before 6.5. What is does: for locale-enabled servers: use index if last char before '%' is ascii. for non-locale servers: do not use locale if last char is non-ascii since it is wrong anyway. Comments? regards, -- ----------------- Göran Thyni On quiet nights you can hear Windows NT reboot!diff -c pgsql/src/backend/optimizer/path/indxpath.c work/pgsql/src/backend/optimizer/path/indxpath.c *** pgsql/src/backend/optimizer/path/indxpath.c Wed Oct 6 18:33:57 1999 --- work/pgsql/src/backend/optimizer/path/indxpath.c Fri Oct 15 19:54:34 1999 *************** *** 1934,1968 **** op = makeOper(optup->t_data->t_oid, InvalidOid, BOOLOID, 0, NULL); expr = make_opclause(op, leftop, (Var *) con); result = lcons(expr, NIL); - /* ! * In ASCII locale we say "x <= prefix\377". This does not ! * work for non-ASCII collation orders, and it's not really ! * right even for ASCII. FIX ME! ! * Note we assume the passed prefix string is workspace with ! * an extra byte, as created by the xxx_fixed_prefix routines above. */ ! #ifndef USE_LOCALE ! prefixlen = strlen(prefix); ! prefix[prefixlen] = '\377'; ! prefix[prefixlen+1] = '\0'; ! ! optup = SearchSysCacheTuple(OPRNAME, ! PointerGetDatum("<="), ! ObjectIdGetDatum(datatype), ! ObjectIdGetDatum(datatype), ! CharGetDatum('b')); ! if (!HeapTupleIsValid(optup)) ! elog(ERROR, "prefix_quals: no <= operator for type %u", datatype); ! conval = (datatype == NAMEOID) ? ! (void*) namein(prefix) : (void*) textin(prefix); ! con = makeConst(datatype, ((datatype == NAMEOID) ? NAMEDATALEN : -1), ! PointerGetDatum(conval), ! false, false, false, false); ! op = makeOper(optup->t_data->t_oid, InvalidOid, BOOLOID, 0, NULL); ! expr = make_opclause(op, leftop, (Var *) con); ! result = lappend(result, expr); ! #endif ! return result; } --- 1934,1970 ---- op = makeOper(optup->t_data->t_oid, InvalidOid, BOOLOID, 0, NULL); expr = make_opclause(op, leftop, (Var *) con); result = lcons(expr, NIL); /* ! * If last is in ascii range make it indexable, ! * else let it be. ! * FIXME: find way to use locate for this to support ! * indexing of non-ascii characters. */ ! prefixlen = strlen(prefix) - 1; ! elog(DEBUG, "XXX1 %s", prefix); ! if ((unsigned) prefix[prefixlen] < 126) ! { ! prefix[prefixlen]++; ! elog(DEBUG, "XXX2 %s", prefix); ! optup = SearchSysCacheTuple(OPRNAME, ! PointerGetDatum("<="), ! ObjectIdGetDatum(datatype), ! ObjectIdGetDatum(datatype), ! CharGetDatum('b')); ! if (!HeapTupleIsValid(optup)) ! elog(ERROR, "prefix_quals: no <= operator for type %u", datatype); ! conval = (datatype == NAMEOID) ? ! (void*) namein(prefix) : (void*) textin(prefix); ! con = makeConst(datatype, ((datatype == NAMEOID) ? NAMEDATALEN : -1), ! PointerGetDatum(conval), ! false, false, false, false); ! op = makeOper(optup->t_data->t_oid, InvalidOid, BOOLOID, 0, NULL); ! expr = make_opclause(op, leftop, (Var *) con); ! result = lappend(result, expr); ! } return result; }
Attachment
pgsql-hackers by date: