Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Tweak parse location assignment for CURRENT_DATE and related constructs.
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 21 Jan 2014 21:34:28 +0000 (16:34 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 21 Jan 2014 21:34:28 +0000 (16:34 -0500)
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

src/backend/parser/gram.y

index 12a6bebfe2f6836410d688e70ecebd7450a2341d..2ce13654eff3e5cc01125e81ba405bfd5dcffd19 100644 (file)
@@ -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
                {