1010 *
1111 *
1212 * IDENTIFICATION
13- * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.79 1999/05/20 12:12:55 wieck Exp $
13+ * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.80 1999/05/21 04:40:04 momjian Exp $
1414 *
1515 * HISTORY
1616 * AUTHORDATEMAJOR EVENT
@@ -5347,7 +5347,7 @@ mapTargetColumns(List *src, List *dst)
53475347static Node *makeIndexable(char *opname, Node *lexpr, Node *rexpr)
53485348{
53495349Node *result = NULL;
5350-
5350+
53515351/* we do this so indexes can be used */
53525352if (strcmp(opname,"~") == 0 ||
53535353strcmp(opname,"~*") == 0)
@@ -5360,47 +5360,64 @@ static Node *makeIndexable(char *opname, Node *lexpr, Node *rexpr)
53605360char *match_least = palloc(strlen(n->val.val.str)+2);
53615361char *match_most = palloc(strlen(n->val.val.str)+2);
53625362int pos, match_pos=0;
5363+ bool found_pipe = false;
53635364
5364- /* skip leading ^ */
53655365for (pos = 1; n->val.val.str[pos]; pos++)
53665366{
5367- if (n->val.val.str[pos] == '.' ||
5368- n->val.val.str[pos] == '?' ||
5369- n->val.val.str[pos] == '*' ||
5370- n->val.val.str[pos] == '[' ||
5371- n->val.val.str[pos] == '$' ||
5372- (strcmp(opname,"~*") == 0 && isalpha(n->val.val.str[pos])))
5373- break;
5367+ if (n->val.val.str[pos] == '|')
5368+ {
5369+ found_pipe = true;
5370+ break;
5371+ }
53745372 if (n->val.val.str[pos] == '\\')
53755373pos++;
5376- match_least[match_pos] = n->val.val.str[pos];
5377- match_most[match_pos++] = n->val.val.str[pos];
53785374}
53795375
5380- if (match_pos != 0)
5376+ /* skip leading ^ */
5377+ if (!found_pipe)
53815378{
5382- A_Const *least = makeNode(A_Const);
5383- A_Const *most = makeNode(A_Const);
5384-
5385- /* make strings to be used in index use */
5386- match_least[match_pos] = '\0';
5387- match_most[match_pos] = '\377';
5388- match_most[match_pos+1] = '\0';
5389- least->val.type = T_String;
5390- least->val.val.str = match_least;
5391- most->val.type = T_String;
5392- most->val.val.str = match_most;
5379+ for (pos = 1; n->val.val.str[pos]; pos++)
5380+ {
5381+ if (n->val.val.str[pos] == '.' ||
5382+ n->val.val.str[pos] == '?' ||
5383+ n->val.val.str[pos] == '*' ||
5384+ n->val.val.str[pos] == '[' ||
5385+ n->val.val.str[pos] == '$' ||
5386+ (strcmp(opname,"~*") == 0 && isalpha(n->val.val.str[pos])))
5387+ break;
5388+ if (n->val.val.str[pos] == '\\')
5389+ pos++;
5390+ if (n->val.val.str[pos] == '\0')
5391+ break;
5392+ match_least[match_pos] = n->val.val.str[pos];
5393+ match_most[match_pos++] = n->val.val.str[pos];
5394+ }
5395+
5396+ if (match_pos != 0)
5397+ {
5398+ A_Const *least = makeNode(A_Const);
5399+ A_Const *most = makeNode(A_Const);
5400+
5401+ /* make strings to be used in index use */
5402+ match_least[match_pos] = '\0';
5403+ match_most[match_pos] = '\377';
5404+ match_most[match_pos+1] = '\0';
5405+ least->val.type = T_String;
5406+ least->val.val.str = match_least;
5407+ most->val.type = T_String;
5408+ most->val.val.str = match_most;
53935409#ifdef USE_LOCALE
5394- result = makeA_Expr(AND, NULL,
5395- makeA_Expr(OP, "~", lexpr, rexpr),
5396- makeA_Expr(OP, ">=", lexpr, (Node *)least));
5410+ result = makeA_Expr(AND, NULL,
5411+ makeA_Expr(OP, "~", lexpr, rexpr),
5412+ makeA_Expr(OP, ">=", lexpr, (Node *)least));
53975413#else
5398- result = makeA_Expr(AND, NULL,
5399- makeA_Expr(OP, "~", lexpr, rexpr),
5400- makeA_Expr(AND, NULL,
5401- makeA_Expr(OP, ">=", lexpr, (Node *)least),
5402- makeA_Expr(OP, "<=", lexpr, (Node *)most)));
5414+ result = makeA_Expr(AND, NULL,
5415+ makeA_Expr(OP, "~", lexpr, rexpr),
5416+ makeA_Expr(AND, NULL,
5417+ makeA_Expr(OP, ">=", lexpr, (Node *)least),
5418+ makeA_Expr(OP, "<=", lexpr, (Node *)most)));
54035419#endif
5420+ }
54045421}
54055422}
54065423}
@@ -5420,9 +5437,9 @@ static Node *makeIndexable(char *opname, Node *lexpr, Node *rexpr)
54205437 n->val.val.str[pos+1] != '%')
54215438break;
54225439if(n->val.val.str[pos] == '_')
5423- break;
5424- if (n->val.val.str[pos] == '\\' ||
5425- n->val.val.str[pos] == '%')
5440+ break;
5441+ if (n->val.val.str[pos] == '\\' ||
5442+ n->val.val.str[pos+1 ] == '%')
54265443pos++;
54275444if (n->val.val.str[pos] == '\0')
54285445break;