diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2008-04-29 20:44:49 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2008-04-29 20:44:49 +0000 |
commit | c0cf5c37cd273995268e8c16e90e816a66474ddd (patch) | |
tree | efef512f71c53f064f4ca498692adea7b5d3cb92 /src/backend/parser | |
parent | 77d3b98c37da1e11fa32213354b95d280a0e5b63 (diff) |
Some minor further cleanup around A_Const. Don't attach a typecast in
makeFloatConst, and avoid "manual" construction of A_Const nodes in grammar
productions, in favor of using makeXXXConst subroutines.
Diffstat (limited to 'src/backend/parser')
-rw-r--r-- | src/backend/parser/gram.y | 84 | ||||
-rw-r--r-- | src/backend/parser/parse_type.c | 25 |
2 files changed, 41 insertions, 68 deletions
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index 7908b447112..56a56627e7f 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 9e3e0f2e75b..78e210167dc 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)) |