aboutsummaryrefslogtreecommitdiff
path: root/src/backend/parser/parse_expr.c
diff options
context:
space:
mode:
authorBruce Momjian <bruce@momjian.us>1998-01-20 05:05:08 +0000
committerBruce Momjian <bruce@momjian.us>1998-01-20 05:05:08 +0000
commit412a5e653949b930d03056da73afca3c505a80f5 (patch)
tree34e0449e1a5f121775007fe3f106d8c39ca0cc18 /src/backend/parser/parse_expr.c
parent8700377384b42ce1d3aeba82fcf6d73a7ff880bb (diff)
downloadpostgresql-412a5e653949b930d03056da73afca3c505a80f5.tar.gz
postgresql-412a5e653949b930d03056da73afca3c505a80f5.zip
Parser cleanup.
Add lock to i386 asm.
Diffstat (limited to 'src/backend/parser/parse_expr.c')
-rw-r--r--src/backend/parser/parse_expr.c169
1 files changed, 21 insertions, 148 deletions
diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c
index e321a8517e5..ef42a61fe29 100644
--- a/src/backend/parser/parse_expr.c
+++ b/src/backend/parser/parse_expr.c
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/parser/parse_expr.c,v 1.10 1998/01/19 18:10:56 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/parser/parse_expr.c,v 1.11 1998/01/20 05:04:14 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -55,8 +55,8 @@ transformExpr(ParseState *pstate, Node *expr, int precedence)
Attr *att = (Attr *) expr;
Node *temp;
- /* what if att.attrs == "*"?? */
- temp = handleNestedDots(pstate, att, &pstate->p_last_resno,
+ /* what if att.attrs == "*"? */
+ temp = ParseNestedFuncOrColumn(pstate, att, &pstate->p_last_resno,
precedence);
if (att->indirection != NIL)
{
@@ -77,11 +77,6 @@ transformExpr(ParseState *pstate, Node *expr, int precedence)
if (exprType(lexpr) != INT4OID)
elog(ERROR, "array index expressions must be int4's");
}
-#if 0
- pfree(ai->uidx);
- if (ai->lidx != NULL)
- pfree(ai->lidx);
-#endif
ai->lidx = lexpr;
ai->uidx = uexpr;
@@ -106,13 +101,9 @@ transformExpr(ParseState *pstate, Node *expr, int precedence)
Value *val = &con->val;
if (con->typename != NULL)
- {
- result = parser_typecast(val, con->typename, -1);
- }
+ result = parser_typecast(val, con->typename, 0);
else
- {
result = (Node *) make_const(val);
- }
break;
}
case T_ParamNo:
@@ -125,9 +116,7 @@ transformExpr(ParseState *pstate, Node *expr, int precedence)
paramno = pno->number;
toid = param_type(paramno);
if (!OidIsValid(toid))
- {
elog(ERROR, "Parameter '$%d' is out of range", paramno);
- }
param = makeNode(Param);
param->paramkind = PARAM_NUM;
param->paramid = (AttrNumber) paramno;
@@ -156,7 +145,7 @@ transformExpr(ParseState *pstate, Node *expr, int precedence)
{
Node *lexpr = transformExpr(pstate, a->lexpr, precedence);
- result = ParseFunc(pstate,
+ result = ParseFuncOrColumn(pstate,
"nullvalue", lcons(lexpr, NIL),
&pstate->p_last_resno,
precedence);
@@ -166,7 +155,7 @@ transformExpr(ParseState *pstate, Node *expr, int precedence)
{
Node *lexpr = transformExpr(pstate, a->lexpr, precedence);
- result = ParseFunc(pstate,
+ result = ParseFuncOrColumn(pstate,
"nonnullvalue", lcons(lexpr, NIL),
&pstate->p_last_resno,
precedence);
@@ -229,7 +218,6 @@ transformExpr(ParseState *pstate, Node *expr, int precedence)
}
case T_Ident:
{
-
/*
* look for a column name or a relation name (the default
* behavior)
@@ -245,7 +233,7 @@ transformExpr(ParseState *pstate, Node *expr, int precedence)
/* transform the list of arguments */
foreach(args, fn->args)
lfirst(args) = transformExpr(pstate, (Node *) lfirst(args), precedence);
- result = ParseFunc(pstate,
+ result = ParseFuncOrColumn(pstate,
fn->funcname, fn->args, &pstate->p_last_resno,
precedence);
break;
@@ -272,22 +260,21 @@ transformExpr(ParseState *pstate, Node *expr, int precedence)
{
char *op = lfirst(sublink->oper);
List *left_expr = sublink->lefthand;
- List *right_expr = subselect->targetList;
- List *elist;
-
+ List *right_expr = subselect->targetList;
+ List *elist;
+
sublink->oper = NIL;
- foreach(elist, left_expr)
- {
+ foreach(elist, left_expr)
+ {
Node *lexpr = lfirst(elist);
- Node *rexpr = lfirst(right_expr);
- TargetEntry *tent = (TargetEntry *)rexpr;
- Expr *op_expr;
-
- op_expr = make_op(op, lexpr, tent->expr);
- sublink->oper = lappendi(sublink->oper,
- ((Oper *)op_expr->oper)->opno);
- right_expr = lnext(right_expr);
- }
+ Node *rexpr = lfirst(right_expr);
+ TargetEntry *tent = (TargetEntry *)rexpr;
+ Expr *op_expr;
+
+ op_expr = make_op(op, lexpr, tent->expr);
+ sublink->oper = lappend(sublink->oper, op_expr->oper);
+ right_expr = lnext(right_expr);
+ }
result = (Node *) expr;
}
break;
@@ -320,7 +307,7 @@ transformIdent(ParseState *pstate, Node *expr, int precedence)
att->relname = rte->refname;
att->attrs = lcons(makeString(ident->name), NIL);
column_result =
- (Node *) handleNestedDots(pstate, att, &pstate->p_last_resno,
+ (Node *) ParseNestedFuncOrColumn(pstate, att, &pstate->p_last_resno,
precedence);
}
@@ -403,51 +390,6 @@ exprType(Node *expr)
return type;
}
-/*
- ** HandleNestedDots --
- ** Given a nested dot expression (i.e. (relation func ... attr), build up
- ** a tree with of Iter and Func nodes.
- */
-Node *
-handleNestedDots(ParseState *pstate, Attr *attr, int *curr_resno, int precedence)
-{
- List *mutator_iter;
- Node *retval = NULL;
-
- if (attr->paramNo != NULL)
- {
- Param *param = (Param *) transformExpr(pstate, (Node *) attr->paramNo, EXPR_RELATION_FIRST);
-
- retval =
- ParseFunc(pstate, strVal(lfirst(attr->attrs)),
- lcons(param, NIL),
- curr_resno,
- precedence);
- }
- else
- {
- Ident *ident = makeNode(Ident);
-
- ident->name = attr->relname;
- ident->isRel = TRUE;
- retval =
- ParseFunc(pstate, strVal(lfirst(attr->attrs)),
- lcons(ident, NIL),
- curr_resno,
- precedence);
- }
-
- foreach(mutator_iter, lnext(attr->attrs))
- {
- retval = ParseFunc(pstate, strVal(lfirst(mutator_iter)),
- lcons(retval, NIL),
- curr_resno,
- precedence);
- }
-
- return (retval);
-}
-
static Node *
parser_typecast(Value *expr, TypeName *typename, int atttypmod)
{
@@ -489,69 +431,10 @@ parser_typecast(Value *expr, TypeName *typename, int atttypmod)
len = typeLen(tp);
-#if 0 /* fix me */
- switch (CInteger(lfirst(expr)))
- {
- case INT4OID: /* int4 */
- const_string = (char *) palloc(256);
- string_palloced = true;
- sprintf(const_string, "%d", ((Const *) lnext(expr))->constvalue);
- break;
-
- case NAMEOID: /* char16 */
- const_string = (char *) palloc(256);
- string_palloced = true;
- sprintf(const_string, "%s", ((Const *) lnext(expr))->constvalue);
- break;
-
- case CHAROID: /* char */
- const_string = (char *) palloc(256);
- string_palloced = true;
- sprintf(const_string, "%c", ((Const) lnext(expr))->constvalue);
- break;
-
- case FLOAT8OID: /* float8 */
- const_string = (char *) palloc(256);
- string_palloced = true;
- sprintf(const_string, "%f", ((Const) lnext(expr))->constvalue);
- break;
-
- case CASHOID: /* money */
- const_string = (char *) palloc(256);
- string_palloced = true;
- sprintf(const_string, "%d",
- (int) ((Const *) expr)->constvalue);
- break;
-
- case TEXTOID: /* text */
- const_string = DatumGetPointer(((Const) lnext(expr))->constvalue);
- const_string = (char *) textout((struct varlena *) const_string);
- break;
-
- case UNKNOWNOID: /* unknown */
- const_string = DatumGetPointer(((Const) lnext(expr))->constvalue);
- const_string = (char *) textout((struct varlena *) const_string);
- break;
-
- default:
- elog(ERROR, "unknown type %d", CInteger(lfirst(expr)));
- }
-#endif
-
cp = stringTypeString(tp, const_string, atttypmod);
if (!typeByVal(tp))
- {
-/*
- if (len >= 0 && len != PSIZE(cp)) {
- char *pp;
- pp = (char *) palloc(len);
- memmove(pp, cp, len);
- cp = pp;
- }
-*/
lcp = PointerGetDatum(cp);
- }
else
{
switch (len)
@@ -676,17 +559,7 @@ parser_typecast2(Node *expr, Oid exprType, Type tp, int atttypmod)
cp = stringTypeString(tp, const_string, atttypmod);
if (!typeByVal(tp))
- {
-/*
- if (len >= 0 && len != PSIZE(cp)) {
- char *pp;
- pp = (char *) palloc(len);
- memmove(pp, cp, len);
- cp = pp;
- }
-*/
lcp = PointerGetDatum(cp);
- }
else
{
switch (len)