diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2014-01-21 16:34:28 -0500 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2014-01-21 16:34:28 -0500 |
commit | 69c7a9838c82bbfdd61301c697e3774e9543805e (patch) | |
tree | 6982ddc5226ffc7b7fd1b50b67bf721ac9203d00 | |
parent | 01f7808b3eafcae1f6077f2f61e13b4c132ccd47 (diff) | |
download | postgresql-69c7a9838c82bbfdd61301c697e3774e9543805e.tar.gz postgresql-69c7a9838c82bbfdd61301c697e3774e9543805e.zip |
Tweak parse location assignment for CURRENT_DATE and related constructs.
All these constructs generate parse trees consisting of a Const and
a run-time type coercion (perhaps a FuncExpr or a CoerceViaIO). Modify
the raw parse output so that we end up with the original token's location
attached to the type coercion node while the Const has location -1;
before, it was the other way around. This makes no difference in terms
of what exprLocation() will say about the parse tree as a whole, so it
should not have any user-visible impact. The point of changing it is that
we do not want contrib/pg_stat_statements to treat these constructs as
replaceable constants. It will do the right thing if the Const has
location -1 rather than a valid location.
This is a pretty ugly hack, but then this code is ugly already; we should
someday replace this translation with special-purpose parse node(s) that
would allow ruleutils.c to reconstruct the original query text.
(See also commit 5d3fcc4c2e137417ef470d604fee5e452b22f6a7, which also
hacked location assignment rules for the benefit of pg_stat_statements.)
Back-patch to 9.2 where pg_stat_statements grew the ability to recognize
replaceable constants.
Kyotaro Horiguchi
-rw-r--r-- | src/backend/parser/gram.y | 47 |
1 files changed, 26 insertions, 21 deletions
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index 12a6bebfe2f..2ce13654eff 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -11361,10 +11361,10 @@ func_expr: func_application within_group_clause filter_clause over_clause ; /* - * As func_expr but does not accept WINDOW functions directly (they - * can still be contained in arguments for functions etc.) - * Use this when window expressions are not allowed, so to disambiguate - * the grammar. (e.g. in CREATE INDEX) + * As func_expr but does not accept WINDOW functions directly + * (but they can still be contained in arguments for functions etc). + * Use this when window expressions are not allowed, where needed to + * disambiguate the grammar (e.g. in CREATE INDEX). */ func_expr_windowless: func_application { $$ = $1; } @@ -11372,7 +11372,7 @@ func_expr_windowless: ; /* - * Special expression + * Special expressions that are considered to be functions. */ func_expr_common_subexpr: COLLATION FOR '(' a_expr ')' @@ -11397,10 +11397,15 @@ func_expr_common_subexpr: * of type-input conversion functions. (As of PG 7.3 * that is actually possible, but not clear that we want * to rely on it.) + * + * The token location is attached to the run-time + * typecast, not to the Const, for the convenience of + * pg_stat_statements (which doesn't want these constructs + * to appear to be replaceable constants). */ Node *n; - n = makeStringConstCast("now", @1, SystemTypeName("text")); - $$ = makeTypeCast(n, SystemTypeName("date"), -1); + n = makeStringConstCast("now", -1, SystemTypeName("text")); + $$ = makeTypeCast(n, SystemTypeName("date"), @1); } | CURRENT_TIME { @@ -11409,8 +11414,8 @@ func_expr_common_subexpr: * See comments for CURRENT_DATE. */ Node *n; - n = makeStringConstCast("now", @1, SystemTypeName("text")); - $$ = makeTypeCast(n, SystemTypeName("timetz"), -1); + n = makeStringConstCast("now", -1, SystemTypeName("text")); + $$ = makeTypeCast(n, SystemTypeName("timetz"), @1); } | CURRENT_TIME '(' Iconst ')' { @@ -11420,10 +11425,10 @@ func_expr_common_subexpr: */ Node *n; TypeName *d; - n = makeStringConstCast("now", @1, SystemTypeName("text")); + n = makeStringConstCast("now", -1, SystemTypeName("text")); d = SystemTypeName("timetz"); d->typmods = list_make1(makeIntConst($3, @3)); - $$ = makeTypeCast(n, d, -1); + $$ = makeTypeCast(n, d, @1); } | CURRENT_TIMESTAMP { @@ -11441,10 +11446,10 @@ func_expr_common_subexpr: */ Node *n; TypeName *d; - n = makeStringConstCast("now", @1, SystemTypeName("text")); + n = makeStringConstCast("now", -1, SystemTypeName("text")); d = SystemTypeName("timestamptz"); d->typmods = list_make1(makeIntConst($3, @3)); - $$ = makeTypeCast(n, d, -1); + $$ = makeTypeCast(n, d, @1); } | LOCALTIME { @@ -11453,8 +11458,8 @@ func_expr_common_subexpr: * See comments for CURRENT_DATE. */ Node *n; - n = makeStringConstCast("now", @1, SystemTypeName("text")); - $$ = makeTypeCast((Node *)n, SystemTypeName("time"), -1); + n = makeStringConstCast("now", -1, SystemTypeName("text")); + $$ = makeTypeCast((Node *)n, SystemTypeName("time"), @1); } | LOCALTIME '(' Iconst ')' { @@ -11464,10 +11469,10 @@ func_expr_common_subexpr: */ Node *n; TypeName *d; - n = makeStringConstCast("now", @1, SystemTypeName("text")); + n = makeStringConstCast("now", -1, SystemTypeName("text")); d = SystemTypeName("time"); d->typmods = list_make1(makeIntConst($3, @3)); - $$ = makeTypeCast((Node *)n, d, -1); + $$ = makeTypeCast((Node *)n, d, @1); } | LOCALTIMESTAMP { @@ -11476,8 +11481,8 @@ func_expr_common_subexpr: * See comments for CURRENT_DATE. */ Node *n; - n = makeStringConstCast("now", @1, SystemTypeName("text")); - $$ = makeTypeCast(n, SystemTypeName("timestamp"), -1); + n = makeStringConstCast("now", -1, SystemTypeName("text")); + $$ = makeTypeCast(n, SystemTypeName("timestamp"), @1); } | LOCALTIMESTAMP '(' Iconst ')' { @@ -11487,10 +11492,10 @@ func_expr_common_subexpr: */ Node *n; TypeName *d; - n = makeStringConstCast("now", @1, SystemTypeName("text")); + n = makeStringConstCast("now", -1, SystemTypeName("text")); d = SystemTypeName("timestamp"); d->typmods = list_make1(makeIntConst($3, @3)); - $$ = makeTypeCast(n, d, -1); + $$ = makeTypeCast(n, d, @1); } | CURRENT_ROLE { |