diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index 7908b44711265e8f83b5732a5f0000726a378366..56a56627e7fce455caaf860c31e20e3f084c6e54 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -11,7 +11,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.613 2008/04/29 14:59:16 alvherre Exp $ + * $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.614 2008/04/29 20:44:49 tgl Exp $ * * HISTORY * AUTHOR DATE MAJOR EVENT @@ -95,6 +95,8 @@ static Node *makeStringConst(char *str); static Node *makeStringConstCast(char *str, TypeName *typename); static Node *makeIntConst(int val); static Node *makeFloatConst(char *str); +static Node *makeBitStringConst(char *str); +static Node *makeNullAConst(void); static Node *makeAConst(Value *v); static Node *makeBoolAConst(bool state); static FuncCall *makeOverlaps(List *largs, List *rargs, int location); @@ -6395,9 +6397,7 @@ select_limit_value: | ALL { /* LIMIT ALL is represented as a NULL constant */ - A_Const *n = makeNode(A_Const); - n->val.type = T_Null; - $$ = (Node *)n; + $$ = makeNullAConst(); } ; @@ -7409,11 +7409,9 @@ a_expr: c_expr { $$ = $1; } | a_expr SIMILAR TO a_expr %prec SIMILAR { - A_Const *c = makeNode(A_Const); FuncCall *n = makeNode(FuncCall); - c->val.type = T_Null; n->funcname = SystemFuncName("similar_escape"); - n->args = list_make2($4, (Node *) c); + n->args = list_make2($4, makeNullAConst()); n->agg_star = FALSE; n->agg_distinct = FALSE; n->location = @2; @@ -7431,11 +7429,9 @@ a_expr: c_expr { $$ = $1; } } | a_expr NOT SIMILAR TO a_expr %prec SIMILAR { - A_Const *c = makeNode(A_Const); FuncCall *n = makeNode(FuncCall); - c->val.type = T_Null; n->funcname = SystemFuncName("similar_escape"); - n->args = list_make2($5, (Node *) c); + n->args = list_make2($5, makeNullAConst()); n->agg_star = FALSE; n->agg_distinct = FALSE; n->location = @5; @@ -8251,11 +8247,7 @@ func_expr: func_name '(' ')' xml_root_version: VERSION_P a_expr { $$ = $2; } | VERSION_P NO VALUE_P - { - A_Const *val = makeNode(A_Const); - val->val.type = T_Null; - $$ = (Node *) val; - } + { $$ = makeNullAConst(); } ; opt_xml_root_standalone: ',' STANDALONE_P YES_P @@ -8409,10 +8401,7 @@ array_expr_list: array_expr { $$ = list_make1($1); } extract_list: extract_arg FROM a_expr { - A_Const *n = makeNode(A_Const); - n->val.type = T_String; - n->val.val.str = $1; - $$ = list_make2((Node *) n, $3); + $$ = list_make2(makeStringConst($1), $3); } | /*EMPTY*/ { $$ = NIL; } ; @@ -8496,10 +8485,7 @@ substr_list: * which it is likely to do if the second argument * is unknown or doesn't have an implicit cast to int4. */ - A_Const *n = makeNode(A_Const); - n->val.type = T_Integer; - n->val.val.ival = 1; - $$ = list_make3($1, (Node *) n, + $$ = list_make3($1, makeIntConst(1), makeTypeCast($2, SystemTypeName("int4"))); } | expr_list @@ -8811,31 +8797,19 @@ func_name: type_function_name */ AexprConst: Iconst { - A_Const *n = makeNode(A_Const); - n->val.type = T_Integer; - n->val.val.ival = $1; - $$ = (Node *)n; + $$ = makeIntConst($1); } | FCONST { - A_Const *n = makeNode(A_Const); - n->val.type = T_Float; - n->val.val.str = $1; - $$ = (Node *)n; + $$ = makeFloatConst($1); } | Sconst { - A_Const *n = makeNode(A_Const); - n->val.type = T_String; - n->val.val.str = $1; - $$ = (Node *)n; + $$ = makeStringConst($1); } | BCONST { - A_Const *n = makeNode(A_Const); - n->val.type = T_BitString; - n->val.val.str = $1; - $$ = (Node *)n; + $$ = makeBitStringConst($1); } | XCONST { @@ -8844,10 +8818,7 @@ AexprConst: Iconst * a <general literal> shall not be a * <bit string literal> or a <hex string literal>. */ - A_Const *n = makeNode(A_Const); - n->val.type = T_BitString; - n->val.val.str = $1; - $$ = (Node *)n; + $$ = makeBitStringConst($1); } | func_name Sconst { @@ -8893,9 +8864,7 @@ AexprConst: Iconst } | NULL_P { - A_Const *n = makeNode(A_Const); - n->val.type = T_Null; - $$ = (Node *)n; + $$ = makeNullAConst(); } ; @@ -9482,7 +9451,28 @@ makeFloatConst(char *str) n->val.type = T_Float; n->val.val.str = str; - return makeTypeCast((Node *)n, SystemTypeName("float8")); + return (Node *)n; +} + +static Node * +makeBitStringConst(char *str) +{ + A_Const *n = makeNode(A_Const); + + n->val.type = T_BitString; + n->val.val.str = str; + + return (Node *)n; +} + +static Node * +makeNullAConst(void) +{ + A_Const *n = makeNode(A_Const); + + n->val.type = T_Null; + + return (Node *)n; } static Node * diff --git a/src/backend/parser/parse_type.c b/src/backend/parser/parse_type.c index 9e3e0f2e75b208656dd716a84b8b8ce4d25f48a4..78e210167dcb67225c05db504c93ebd2f6c90bf2 100644 --- a/src/backend/parser/parse_type.c +++ b/src/backend/parser/parse_type.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/parser/parse_type.c,v 1.96 2008/04/29 14:59:17 alvherre Exp $ + * $PostgreSQL: pgsql/src/backend/parser/parse_type.c,v 1.97 2008/04/29 20:44:49 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -294,28 +294,11 @@ typenameTypeMod(ParseState *pstate, const TypeName *typename, Type typ) cstr = (char *) palloc(32); snprintf(cstr, 32, "%ld", (long) ac->val.val.ival); } - else + else if (IsA(&ac->val, Float) || + IsA(&ac->val, String)) + { /* we can just use the str field directly. */ cstr = ac->val.val.str; - } - else if (IsA(tm, TypeCast)) - { - /* - * The grammar hands back some integers with ::int4 attached, so - * allow a cast decoration if it's an Integer value, but not - * otherwise. - */ - TypeCast *tc = (TypeCast *) tm; - - if (IsA(tc->arg, A_Const)) - { - A_Const *ac = (A_Const *) tc->arg; - - if (IsA(&ac->val, Integer)) - { - cstr = (char *) palloc(32); - snprintf(cstr, 32, "%ld", (long) ac->val.val.ival); - } } } else if (IsA(tm, ColumnRef)) diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index df3186b77cffff37b7fd69d536fe14820b8aa7c0..f1f6c9decae2ce4a13d8162fc201a7218b42c502 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -10,7 +10,7 @@ * Written by Peter Eisentraut <peter_e@gmx.net>. * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.448 2008/04/29 14:59:17 alvherre Exp $ + * $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.449 2008/04/29 20:44:49 tgl Exp $ * *-------------------------------------------------------------------- */ @@ -5209,7 +5209,8 @@ flatten_set_variable_args(const char *name, List *args) /* * Each list member may be a plain A_Const node, or an A_Const within a - * TypeCast, as produced by makeFloatConst() et al in gram.y. + * TypeCast; the latter case is supported only for ConstInterval + * arguments (for SET TIME ZONE). */ foreach(l, args) { @@ -5231,8 +5232,8 @@ flatten_set_variable_args(const char *name, List *args) if (!IsA(arg, A_Const)) elog(ERROR, "unrecognized node type: %d", (int) nodeTag(arg)); - con = (A_Const *) arg; + switch (nodeTag(&con->val)) { case T_Integer: @@ -5243,10 +5244,6 @@ flatten_set_variable_args(const char *name, List *args) appendStringInfoString(&buf, strVal(&con->val)); break; case T_String: - /* - * Plain string literal or identifier. For quote mode, - * quote it if it's not a vanilla identifier. - */ val = strVal(&con->val); if (typename != NULL) { @@ -5273,12 +5270,13 @@ flatten_set_variable_args(const char *name, List *args) DatumGetCString(DirectFunctionCall1(interval_out, interval)); appendStringInfo(&buf, "INTERVAL '%s'", intervalout); - - /* don't leave this set */ - typename = NULL; } else { + /* + * Plain string literal or identifier. For quote mode, + * quote it if it's not a vanilla identifier. + */ if (flags & GUC_LIST_QUOTE) appendStringInfoString(&buf, quote_identifier(val)); else diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index fe1410531a6142cd14f7a03769a52976f11d0084..61c3df539139769a6c1ed7949aae85a8fb8f0418 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/nodes/parsenodes.h,v 1.363 2008/04/29 14:59:17 alvherre Exp $ + * $PostgreSQL: pgsql/src/include/nodes/parsenodes.h,v 1.364 2008/04/29 20:44:49 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -228,12 +228,12 @@ typedef struct A_Expr } A_Expr; /* - * A_Const - a constant expression + * A_Const - a literal constant */ typedef struct A_Const { NodeTag type; - Value val; /* the value (with the tag) */ + Value val; /* value (includes type info, see value.h) */ } A_Const; /*