diff options
| author | pengbo | 2017-10-03 10:27:49 +0000 |
|---|---|---|
| committer | pengbo | 2017-10-03 10:27:49 +0000 |
| commit | 57196ae03cab9989c0c15deee49c3d4642450112 (patch) | |
| tree | 492fba5e3d968f9b1661edc8d08f0767ebb4afd2 /src/rewrite | |
| parent | a7f9194d74a578b7e1d85b6ac1eb5cf4939d493b (diff) | |
Import PostgreSQL 10 parser.
Diffstat (limited to 'src/rewrite')
| -rw-r--r-- | src/rewrite/pool_timestamp.c | 118 |
1 files changed, 113 insertions, 5 deletions
diff --git a/src/rewrite/pool_timestamp.c b/src/rewrite/pool_timestamp.c index 2913b4eb4..cf975a656 100644 --- a/src/rewrite/pool_timestamp.c +++ b/src/rewrite/pool_timestamp.c @@ -65,6 +65,7 @@ static bool rewrite_timestamp_insert(InsertStmt *i_stmt, TSRewriteContext *ctx); static bool rewrite_timestamp_update(UpdateStmt *u_stmt, TSRewriteContext *ctx); static char *get_current_timestamp(POOL_CONNECTION_POOL *backend); static Node *makeTsExpr(TSRewriteContext *ctx); +static TypeCast *makeTypeCastFromSvfOp(SQLValueFunctionOp op); static A_Const *makeStringConstFromQuery(POOL_CONNECTION_POOL *backend, char *expression); bool raw_expression_tree_walker(Node *node, bool (*walker) (), void *context); @@ -291,7 +292,7 @@ rewrite_timestamp_walker(Node *node, void *context) rewrite_timestamp_insert(i_stmt, ctx); ctx->relname = relname_old; } - /* tree walker is called in rewrite_timestamp_insert() */ + /* tree walker is called in rewrite_timestamp_insert() */ return false; case T_UpdateStmt: { @@ -304,7 +305,7 @@ rewrite_timestamp_walker(Node *node, void *context) rewrite_timestamp_update(u_stmt, ctx); ctx->relname = relname_old; } - /* tree walker is called in rewrite_timestamp_update() */ + /* tree walker is called in rewrite_timestamp_update() */ return false; case T_FuncCall: { @@ -320,17 +321,61 @@ rewrite_timestamp_walker(Node *node, void *context) TypeCast *tc = makeNode(TypeCast); tc->arg = makeTsExpr(ctx); tc->typeName = SystemTypeName("text"); - + fcall->funcname = SystemFuncName("timestamptz"); fcall->args = list_make1(tc); ctx->rewrite = true; } } break; + case T_SQLValueFunction: + { + + /* CURRENT_DATE, CURRENT_TIME, LOCALTIMESTAMP, LOCALTIME etc. + * From PostgreSQL 10, timestamp conversion is changed and + * SQLValueFunction is added. But Pgpool-II should use + * the old timestamp translate like "'now'::text::date". + * So we have to cast the node to TypeCast first. + */ + SQLValueFunction *svf = (SQLValueFunction *) node; + + if (svf->op == SVFOP_CURRENT_DATE || + svf->op == SVFOP_CURRENT_TIME || + svf->op == SVFOP_CURRENT_TIME_N || + svf->op == SVFOP_CURRENT_TIMESTAMP || + svf->op == SVFOP_CURRENT_TIMESTAMP_N || + svf->op == SVFOP_LOCALTIME || + svf->op == SVFOP_LOCALTIME_N || + svf->op == SVFOP_LOCALTIMESTAMP || + svf->op == SVFOP_LOCALTIMESTAMP_N) + { + + TypeCast *tc, *tc1; + + tc1 = makeTypeCastFromSvfOp(svf->op); + + tc = (TypeCast *) node; + tc->arg = tc1->arg; + tc->typeName = (TypeName *)copyObject(tc1->typeName); + tc->location = -1; + + node->type = T_TypeCast; + + /* rewrite `'now'::timestamp' and `'now'::text::timestamp' both */ + if (isSystemTypeCast(tc->arg, "text")) + tc = (TypeCast *) tc->arg; + + if (isStringConst(tc->arg, "now")) + { + tc->arg = (Node *) makeTsExpr(ctx); + ctx->rewrite = true; + } + } + } + break; case T_TypeCast: { - /* CURRENT_DATE, CURRENT_TIME, LOCALTIMESTAMP, LOCALTIME etc.*/ - TypeCast *tc = (TypeCast *) node; + TypeCast *tc = (TypeCast *) node; if ((isSystemType((Node *) tc->typeName, "date") || isSystemType((Node *) tc->typeName, "timestamp") || @@ -1006,6 +1051,69 @@ static A_Const *makeStringConstFromQuery(POOL_CONNECTION_POOL *backend, char *ex return con; } +static TypeCast * +makeTypeCastFromSvfOp(SQLValueFunctionOp op) +{ + TypeName *typename; + Node *n; + int location; + + switch (op) + { + case SVFOP_CURRENT_DATE: + typename = SystemTypeName("date"); + location = 0; + break; + case SVFOP_CURRENT_TIME: + typename = SystemTypeName("timetz"); + location = 0; + break; + case SVFOP_CURRENT_TIME_N: + typename = SystemTypeName("timetz"); + typename->typmods = lcons(makeIntConst(0, 0), NIL); + location = -3; + break; + case SVFOP_CURRENT_TIMESTAMP: + typename = SystemTypeName("timestamptz"); + location = 0; + break; + case SVFOP_CURRENT_TIMESTAMP_N: + typename = SystemTypeName("timestamptz"); + typename->typmods = lcons(makeIntConst(0, 0), NIL); + location = -3; + break; + case SVFOP_LOCALTIME: + typename = SystemTypeName("time"); + location = 0; + break; + case SVFOP_LOCALTIME_N: + typename = SystemTypeName("time"); + typename->typmods = lcons(makeIntConst(0, 0), NIL); + location = -3; + break; + case SVFOP_LOCALTIMESTAMP: + typename = SystemTypeName("timestamp"); + location = 0; + break; + case SVFOP_LOCALTIMESTAMP_N: + typename = SystemTypeName("timestamp");; + typename->typmods = lcons(makeIntConst(0, 0), NIL); + location = -3; + break; + case SVFOP_CURRENT_ROLE: + case SVFOP_CURRENT_USER: + case SVFOP_USER: + case SVFOP_SESSION_USER: + case SVFOP_CURRENT_CATALOG: + case SVFOP_CURRENT_SCHEMA: + break; + } + + n = makeStringConstCast("now", -1, SystemTypeName("text")); + + return (TypeCast *) makeTypeCast(n, typename, location); +} + /* from nodeFuncs.c start */ /* |
