10
10
*
11
11
*
12
12
* IDENTIFICATION
13
- * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.83 1999/05/22 05:06:43 momjian Exp $
13
+ * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.84 1999/06/07 14:28:25 tgl Exp $
14
14
*
15
15
* HISTORY
16
16
* AUTHOR DATE MAJOR EVENT
@@ -5357,6 +5357,7 @@ static Node *makeIndexable(char *opname, Node *lexpr, Node *rexpr)
5357
5357
int pos, match_pos=0;
5358
5358
bool found_special = false;
5359
5359
5360
+ /* Cannot optimize if unquoted | { } is present in pattern */
5360
5361
for (pos = 1; n->val.val.str[pos]; pos++)
5361
5362
{
5362
5363
if (n->val.val.str[pos] == '|' ||
@@ -5367,12 +5368,16 @@ static Node *makeIndexable(char *opname, Node *lexpr, Node *rexpr)
5367
5368
break;
5368
5369
}
5369
5370
if (n->val.val.str[pos] == '\\')
5371
+ {
5370
5372
pos++;
5373
+ if (n->val.val.str[pos] == '\0')
5374
+ break;
5375
+ }
5371
5376
}
5372
5377
5373
- /* skip leading ^ */
5374
5378
if (!found_special)
5375
5379
{
5380
+ /* note start at pos 1 to skip leading ^ */
5376
5381
for (pos = 1; n->val.val.str[pos]; pos++)
5377
5382
{
5378
5383
if (n->val.val.str[pos] == '.' ||
@@ -5383,9 +5388,11 @@ static Node *makeIndexable(char *opname, Node *lexpr, Node *rexpr)
5383
5388
(strcmp(opname,"~*") == 0 && isalpha(n->val.val.str[pos])))
5384
5389
break;
5385
5390
if (n->val.val.str[pos] == '\\')
5391
+ {
5386
5392
pos++;
5387
- if (n->val.val.str[pos] == '\0')
5388
- break;
5393
+ if (n->val.val.str[pos] == '\0')
5394
+ break;
5395
+ }
5389
5396
match_least[match_pos] = n->val.val.str[pos];
5390
5397
match_most[match_pos++] = n->val.val.str[pos];
5391
5398
}
@@ -5430,16 +5437,22 @@ static Node *makeIndexable(char *opname, Node *lexpr, Node *rexpr)
5430
5437
5431
5438
for (pos = 0; n->val.val.str[pos]; pos++)
5432
5439
{
5433
- if (n->val.val.str[pos] == '%' &&
5434
- n->val.val.str[pos+1] != '%')
5435
- break;
5436
- if(n->val.val.str[pos] == '_')
5440
+ /* % and _ are wildcard characters in LIKE */
5441
+ if (n->val.val.str[pos] == '%' ||
5442
+ n->val.val.str[pos] == '_')
5437
5443
break;
5438
- if (n->val.val.str[pos] == '\\' ||
5439
- n->val.val.str[pos+1] == '%')
5444
+ /* Backslash quotes the next character */
5445
+ if (n->val.val.str[pos] == '\\')
5446
+ {
5440
5447
pos++;
5441
- if (n->val.val.str[pos] == '\0')
5442
- break;
5448
+ if (n->val.val.str[pos] == '\0')
5449
+ break;
5450
+ }
5451
+ /*
5452
+ * NOTE: this code used to think that %% meant a literal %,
5453
+ * but textlike() itself does not think that, and the SQL92
5454
+ * spec doesn't say any such thing either.
5455
+ */
5443
5456
match_least[match_pos] = n->val.val.str[pos];
5444
5457
match_most[match_pos++] = n->val.val.str[pos];
5445
5458
}
0 commit comments