diff options
Diffstat (limited to 'src/backend/utils/adt')
-rw-r--r-- | src/backend/utils/adt/date.c | 75 | ||||
-rw-r--r-- | src/backend/utils/adt/ruleutils.c | 128 | ||||
-rw-r--r-- | src/backend/utils/adt/timestamp.c | 66 |
3 files changed, 125 insertions, 144 deletions
diff --git a/src/backend/utils/adt/date.c b/src/backend/utils/adt/date.c index a163fbb4ab..ae0f24de2c 100644 --- a/src/backend/utils/adt/date.c +++ b/src/backend/utils/adt/date.c @@ -46,6 +46,27 @@ /* common code for timetypmodin and timetztypmodin */ static int32 +anytime_typmodin(bool istz, ArrayType *ta) +{ + int32 *tl; + int n; + + tl = ArrayGetIntegerTypmods(ta, &n); + + /* + * we're not too tense about good error message here because grammar + * shouldn't allow wrong number of modifiers for TIME + */ + if (n != 1) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("invalid type modifier"))); + + return anytime_typmod_check(istz, tl[0]); +} + +/* exported so parse_expr.c can use it */ +int32 anytime_typmod_check(bool istz, int32 typmod) { if (typmod < 0) @@ -66,26 +87,6 @@ anytime_typmod_check(bool istz, int32 typmod) return typmod; } -static int32 -anytime_typmodin(bool istz, ArrayType *ta) -{ - int32 *tl; - int n; - - tl = ArrayGetIntegerTypmods(ta, &n); - - /* - * we're not too tense about good error message here because grammar - * shouldn't allow wrong number of modifiers for TIME - */ - if (n != 1) - ereport(ERROR, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("invalid type modifier"))); - - return anytime_typmod_check(istz, tl[0]); -} - /* common code for timetypmodout and timetztypmodout */ static char * anytime_typmodout(bool istz, int32 typmod) @@ -301,10 +302,10 @@ EncodeSpecialDate(DateADT dt, char *str) /* - * current_date -- implements CURRENT_DATE + * GetSQLCurrentDate -- implements CURRENT_DATE */ -Datum -current_date(PG_FUNCTION_ARGS) +DateADT +GetSQLCurrentDate(void) { struct pg_tm tm; @@ -330,56 +331,46 @@ current_date(PG_FUNCTION_ARGS) cache_mday = tm.tm_mday; } - return DateADTGetDatum(cache_date); + return cache_date; } /* - * current_time -- implements CURRENT_TIME, CURRENT_TIME(n) + * GetSQLCurrentTime -- implements CURRENT_TIME, CURRENT_TIME(n) */ -Datum -current_time(PG_FUNCTION_ARGS) +TimeTzADT * +GetSQLCurrentTime(int32 typmod) { TimeTzADT *result; struct pg_tm tt, *tm = &tt; fsec_t fsec; int tz; - int32 typmod = -1; - - if (!PG_ARGISNULL(0)) - typmod = anytime_typmod_check(true, PG_GETARG_INT32(0)); GetCurrentTimeUsec(tm, &fsec, &tz); result = (TimeTzADT *) palloc(sizeof(TimeTzADT)); tm2timetz(tm, fsec, tz, result); AdjustTimeForTypmod(&(result->time), typmod); - - return TimeTzADTPGetDatum(result); + return result; } /* - * sql_localtime -- implements LOCALTIME, LOCALTIME(n) + * GetSQLLocalTime -- implements LOCALTIME, LOCALTIME(n) */ -Datum -sql_localtime(PG_FUNCTION_ARGS) +TimeADT +GetSQLLocalTime(int32 typmod) { TimeADT result; struct pg_tm tt, *tm = &tt; fsec_t fsec; int tz; - int32 typmod = -1; - - if (!PG_ARGISNULL(0)) - typmod = anytime_typmod_check(false, PG_GETARG_INT32(0)); GetCurrentTimeUsec(tm, &fsec, &tz); tm2time(tm, fsec, &result); AdjustTimeForTypmod(&result, typmod); - - return TimeADTGetDatum(result); + return result; } diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index 60f9d08d5d..e93d66a7ec 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -8254,6 +8254,7 @@ isSimpleNode(Node *node, Node *parentNode, int prettyFlags) case T_RowExpr: case T_CoalesceExpr: case T_MinMaxExpr: + case T_SQLValueFunction: case T_XmlExpr: case T_NextValueExpr: case T_NullIfExpr: @@ -9242,6 +9243,67 @@ get_rule_expr(Node *node, deparse_context *context, } break; + case T_SQLValueFunction: + { + SQLValueFunction *svf = (SQLValueFunction *) node; + + /* + * Note: this code knows that typmod for time, timestamp, and + * timestamptz just prints as integer. + */ + switch (svf->op) + { + case SVFOP_CURRENT_DATE: + appendStringInfoString(buf, "CURRENT_DATE"); + break; + case SVFOP_CURRENT_TIME: + appendStringInfoString(buf, "CURRENT_TIME"); + break; + case SVFOP_CURRENT_TIME_N: + appendStringInfo(buf, "CURRENT_TIME(%d)", svf->typmod); + break; + case SVFOP_CURRENT_TIMESTAMP: + appendStringInfoString(buf, "CURRENT_TIMESTAMP"); + break; + case SVFOP_CURRENT_TIMESTAMP_N: + appendStringInfo(buf, "CURRENT_TIMESTAMP(%d)", + svf->typmod); + break; + case SVFOP_LOCALTIME: + appendStringInfoString(buf, "LOCALTIME"); + break; + case SVFOP_LOCALTIME_N: + appendStringInfo(buf, "LOCALTIME(%d)", svf->typmod); + break; + case SVFOP_LOCALTIMESTAMP: + appendStringInfoString(buf, "LOCALTIMESTAMP"); + break; + case SVFOP_LOCALTIMESTAMP_N: + appendStringInfo(buf, "LOCALTIMESTAMP(%d)", + svf->typmod); + break; + case SVFOP_CURRENT_ROLE: + appendStringInfoString(buf, "CURRENT_ROLE"); + break; + case SVFOP_CURRENT_USER: + appendStringInfoString(buf, "CURRENT_USER"); + break; + case SVFOP_USER: + appendStringInfoString(buf, "USER"); + break; + case SVFOP_SESSION_USER: + appendStringInfoString(buf, "SESSION_USER"); + break; + case SVFOP_CURRENT_CATALOG: + appendStringInfoString(buf, "CURRENT_CATALOG"); + break; + case SVFOP_CURRENT_SCHEMA: + appendStringInfoString(buf, "CURRENT_SCHEMA"); + break; + } + } + break; + case T_XmlExpr: { XmlExpr *xexpr = (XmlExpr *) node; @@ -9816,6 +9878,7 @@ looks_like_function(Node *node) case T_NullIfExpr: case T_CoalesceExpr: case T_MinMaxExpr: + case T_SQLValueFunction: case T_XmlExpr: /* these are all accepted by func_expr_common_subexpr */ return true; @@ -10218,33 +10281,6 @@ get_windowfunc_expr_helper(WindowFunc *wfunc, deparse_context *context, } /* - * get_func_sql_syntax_time - * - * Parse back argument of SQL-syntax function call related to a time or a - * timestamp. These require a specific handling when their typmod is given - * by the function caller through their SQL keyword. - */ -static void -get_func_sql_syntax_time(List *args, deparse_context *context) -{ - StringInfo buf = context->buf; - Const *cons; - - if (list_length(args) != 1) - return; - - cons = (Const *) linitial(args); - Assert(IsA(cons, Const)); - - if (!cons->constisnull) - { - appendStringInfoString(buf, "("); - get_rule_expr((Node *) cons, context, false); - appendStringInfoString(buf, ")"); - } -} - -/* * get_func_sql_syntax - Parse back a SQL-syntax function call * * Returns true if we successfully deparsed, false if we did not @@ -10470,48 +10506,10 @@ get_func_sql_syntax(FuncExpr *expr, deparse_context *context) appendStringInfoChar(buf, ')'); return true; - case F_CURRENT_CATALOG: - appendStringInfoString(buf, "CURRENT_CATALOG"); - return true; - case F_CURRENT_ROLE: - appendStringInfoString(buf, "CURRENT_ROLE"); - return true; - case F_CURRENT_SCHEMA: - appendStringInfoString(buf, "CURRENT_SCHEMA"); - return true; - case F_CURRENT_USER: - appendStringInfoString(buf, "CURRENT_USER"); - return true; - case F_USER: - appendStringInfoString(buf, "USER"); - return true; - case F_SESSION_USER: - appendStringInfoString(buf, "SESSION_USER"); - return true; case F_SYSTEM_USER: appendStringInfoString(buf, "SYSTEM_USER"); return true; - case F_CURRENT_DATE: - appendStringInfoString(buf, "CURRENT_DATE"); - return true; - case F_CURRENT_TIME: - appendStringInfoString(buf, "CURRENT_TIME"); - get_func_sql_syntax_time(expr->args, context); - return true; - case F_CURRENT_TIMESTAMP: - appendStringInfoString(buf, "CURRENT_TIMESTAMP"); - get_func_sql_syntax_time(expr->args, context); - return true; - case F_LOCALTIME: - appendStringInfoString(buf, "LOCALTIME"); - get_func_sql_syntax_time(expr->args, context); - return true; - case F_LOCALTIMESTAMP: - appendStringInfoString(buf, "LOCALTIMESTAMP"); - get_func_sql_syntax_time(expr->args, context); - return true; - case F_XMLEXISTS: /* XMLEXISTS ... extra parens because args are c_expr */ appendStringInfoString(buf, "XMLEXISTS(("); diff --git a/src/backend/utils/adt/timestamp.c b/src/backend/utils/adt/timestamp.c index aaadc68ae6..0e50aaec5a 100644 --- a/src/backend/utils/adt/timestamp.c +++ b/src/backend/utils/adt/timestamp.c @@ -83,6 +83,27 @@ static Timestamp timestamptz2timestamp(TimestampTz timestamp); /* common code for timestamptypmodin and timestamptztypmodin */ static int32 +anytimestamp_typmodin(bool istz, ArrayType *ta) +{ + int32 *tl; + int n; + + tl = ArrayGetIntegerTypmods(ta, &n); + + /* + * we're not too tense about good error message here because grammar + * shouldn't allow wrong number of modifiers for TIMESTAMP + */ + if (n != 1) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("invalid type modifier"))); + + return anytimestamp_typmod_check(istz, tl[0]); +} + +/* exported so parse_expr.c can use it */ +int32 anytimestamp_typmod_check(bool istz, int32 typmod) { if (typmod < 0) @@ -103,26 +124,6 @@ anytimestamp_typmod_check(bool istz, int32 typmod) return typmod; } -static int32 -anytimestamp_typmodin(bool istz, ArrayType *ta) -{ - int32 *tl; - int n; - - tl = ArrayGetIntegerTypmods(ta, &n); - - /* - * we're not too tense about good error message here because grammar - * shouldn't allow wrong number of modifiers for TIMESTAMP - */ - if (n != 1) - ereport(ERROR, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("invalid type modifier"))); - - return anytimestamp_typmod_check(istz, tl[0]); -} - /* common code for timestamptypmodout and timestamptztypmodout */ static char * anytimestamp_typmodout(bool istz, int32 typmod) @@ -1594,42 +1595,33 @@ GetCurrentTimestamp(void) } /* - * current_timestamp -- implements CURRENT_TIMESTAMP, CURRENT_TIMESTAMP(n) + * GetSQLCurrentTimestamp -- implements CURRENT_TIMESTAMP, CURRENT_TIMESTAMP(n) */ -Datum -current_timestamp(PG_FUNCTION_ARGS) +TimestampTz +GetSQLCurrentTimestamp(int32 typmod) { TimestampTz ts; - int32 typmod = -1; - - if (!PG_ARGISNULL(0)) - typmod = anytimestamp_typmod_check(true, PG_GETARG_INT32(0)); ts = GetCurrentTransactionStartTimestamp(); if (typmod >= 0) AdjustTimestampForTypmod(&ts, typmod, NULL); - return TimestampTzGetDatum(ts); + return ts; } /* - * sql_localtimestamp -- implements LOCALTIMESTAMP, LOCALTIMESTAMP(n) + * GetSQLLocalTimestamp -- implements LOCALTIMESTAMP, LOCALTIMESTAMP(n) */ -Datum -sql_localtimestamp(PG_FUNCTION_ARGS) +Timestamp +GetSQLLocalTimestamp(int32 typmod) { Timestamp ts; - int32 typmod = -1; - - if (!PG_ARGISNULL(0)) - typmod = anytimestamp_typmod_check(false, PG_GETARG_INT32(0)); ts = timestamptz2timestamp(GetCurrentTransactionStartTimestamp()); if (typmod >= 0) AdjustTimestampForTypmod(&ts, typmod, NULL); - return TimestampGetDatum(ts); + return ts; } - /* * timeofday(*) -- returns the current time as a text. */ |