1
0
mirror of https://github.com/postgres/postgres.git synced 2025-11-06 07:49:08 +03:00

Finished the Between patch Christopher started.

Implements between (symmetric / asymmetric) as a node.

Executes the left or right expression once, makes a Const out of the
resulting Datum and executes the >=, <= portions out of the Const sets.

Of course, the parser does a fair amount of preparatory work for this to
happen.

Rod Taylor
This commit is contained in:
Bruce Momjian
2002-07-18 04:41:46 +00:00
parent 7ea5f1d7f1
commit 3e22406ec6
15 changed files with 619 additions and 35 deletions

View File

@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/optimizer/util/clauses.c,v 1.103 2002/07/06 20:16:35 momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/optimizer/util/clauses.c,v 1.104 2002/07/18 04:41:45 momjian Exp $
*
* HISTORY
* AUTHOR DATE MAJOR EVENT
@@ -1817,8 +1817,6 @@ expression_tree_walker(Node *node,
case T_Var:
case T_Param:
case T_RangeTblRef:
/* primitive node types with no subnodes */
break;
case T_Expr:
{
Expr *expr = (Expr *) node;
@@ -1965,6 +1963,18 @@ expression_tree_walker(Node *node,
return true;
}
break;
case T_BetweenExpr:
{
BetweenExpr *betwn = (BetweenExpr *) node;
if (walker(betwn->expr, context))
return true;
if (walker(betwn->lexpr, context))
return true;
if (walker(betwn->rexpr, context))
return true;
}
break;
default:
elog(ERROR, "expression_tree_walker: Unexpected node type %d",
nodeTag(node));
@@ -2123,8 +2133,6 @@ expression_tree_mutator(Node *node,
case T_Var:
case T_Param:
case T_RangeTblRef:
/* primitive node types with no subnodes */
return (Node *) copyObject(node);
case T_Expr:
{
Expr *expr = (Expr *) node;
@@ -2272,6 +2280,18 @@ expression_tree_mutator(Node *node,
return (Node *) newnode;
}
break;
case T_BetweenExpr:
{
BetweenExpr *bexpr = (BetweenExpr *) node;
BetweenExpr *newnode;
FLATCOPY(newnode, bexpr, BetweenExpr);
MUTATE(newnode->expr, bexpr->expr, Node *);
MUTATE(newnode->lexpr, bexpr->lexpr, Node *);
MUTATE(newnode->rexpr, bexpr->rexpr, Node *);
return (Node *) newnode;
}
break;
case T_SubLink:
{
/*