Commit 30ad4273 authored by Bruce Momjian's avatar Bruce Momjian

Fix optimizer indexing not working for negative numbers.

parent dc02fd70
This diff is collapsed.
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.62 1999/03/17 21:02:57 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.63 1999/03/18 21:39:56 momjian Exp $
* *
* HISTORY * HISTORY
* AUTHOR DATE MAJOR EVENT * AUTHOR DATE MAJOR EVENT
...@@ -79,6 +79,7 @@ static char *FlattenStringList(List *list); ...@@ -79,6 +79,7 @@ static char *FlattenStringList(List *list);
static char *fmtId(char *rawid); static char *fmtId(char *rawid);
static Node *makeIndexable(char *opname, Node *lexpr, Node *rexpr); static Node *makeIndexable(char *opname, Node *lexpr, Node *rexpr);
static void param_type_init(Oid *typev, int nargs); static void param_type_init(Oid *typev, int nargs);
static Node *doNegate(Node *n);
Oid param_type(int t); /* used in parse_expr.c */ Oid param_type(int t); /* used in parse_expr.c */
...@@ -3695,7 +3696,7 @@ a_expr: attr opt_indirection ...@@ -3695,7 +3696,7 @@ a_expr: attr opt_indirection
$$ = (Node *)n; $$ = (Node *)n;
} }
| '-' a_expr %prec UMINUS | '-' a_expr %prec UMINUS
{ $$ = makeA_Expr(OP, "-", NULL, $2); } { $$ = doNegate($2); }
| a_expr '+' a_expr | a_expr '+' a_expr
{ $$ = makeA_Expr(OP, "+", $1, $3); } { $$ = makeA_Expr(OP, "+", $1, $3); }
| a_expr '-' a_expr | a_expr '-' a_expr
...@@ -3710,9 +3711,13 @@ a_expr: attr opt_indirection ...@@ -3710,9 +3711,13 @@ a_expr: attr opt_indirection
{ $$ = makeA_Expr(OP, "<", $1, $3); } { $$ = makeA_Expr(OP, "<", $1, $3); }
| a_expr '>' a_expr | a_expr '>' a_expr
{ $$ = makeA_Expr(OP, ">", $1, $3); } { $$ = makeA_Expr(OP, ">", $1, $3); }
/* We allow this for standards-broken SQL products, like MS stuff */ /* We allow this for standards-broken SQL products, like MS stuff */
| a_expr '=' NULL_P | a_expr '=' NULL_P
{ $$ = makeA_Expr(ISNULL, NULL, $1, NULL); } { $$ = makeA_Expr(ISNULL, NULL, $1, NULL); }
| NULL_P '=' %prec '-' a_expr
{ $$ = makeA_Expr(ISNULL, NULL, $3, NULL); }
| a_expr '=' a_expr | a_expr '=' a_expr
{ $$ = makeA_Expr(OP, "=", $1, $3); } { $$ = makeA_Expr(OP, "=", $1, $3); }
| ':' a_expr | ':' a_expr
...@@ -4348,7 +4353,7 @@ b_expr: attr opt_indirection ...@@ -4348,7 +4353,7 @@ b_expr: attr opt_indirection
$$ = (Node *)n; $$ = (Node *)n;
} }
| '-' b_expr %prec UMINUS | '-' b_expr %prec UMINUS
{ $$ = makeA_Expr(OP, "-", NULL, $2); } { $$ = doNegate($2); }
| b_expr '+' b_expr | b_expr '+' b_expr
{ $$ = makeA_Expr(OP, "+", $1, $3); } { $$ = makeA_Expr(OP, "+", $1, $3); }
| b_expr '-' b_expr | b_expr '-' b_expr
...@@ -5678,3 +5683,28 @@ Oid param_type(int t) ...@@ -5678,3 +5683,28 @@ Oid param_type(int t)
return InvalidOid; return InvalidOid;
return param_type_info[t - 1]; return param_type_info[t - 1];
} }
/*
* The optimizer doesn't like '-' 4, but wants an integer of -4, so we
* try to merge the minus into the constant.
*/
static Node *doNegate(Node *n)
{
if (IsA(n, A_Const))
{
A_Const *con = (A_Const *)n;
if (con->val.type == T_Integer)
{
con->val.val.ival = -con->val.val.ival;
return n;
}
if (con->val.type == T_Float)
{
con->val.val.dval = -con->val.val.dval;
return n;
}
}
return makeA_Expr(OP, "-", NULL, n);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment