diff options
Diffstat (limited to 'src/include')
-rw-r--r-- | src/include/catalog/catversion.h | 2 | ||||
-rw-r--r-- | src/include/catalog/pg_proc.dat | 26 | ||||
-rw-r--r-- | src/include/executor/execExpr.h | 8 | ||||
-rw-r--r-- | src/include/nodes/primnodes.h | 43 | ||||
-rw-r--r-- | src/include/utils/date.h | 4 | ||||
-rw-r--r-- | src/include/utils/timestamp.h | 4 |
6 files changed, 60 insertions, 27 deletions
diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h index d10cc28b0c1..e617381bf40 100644 --- a/src/include/catalog/catversion.h +++ b/src/include/catalog/catversion.h @@ -57,6 +57,6 @@ */ /* yyyymmddN */ -#define CATALOG_VERSION_NO 202305121 +#define CATALOG_VERSION_NO 202305171 #endif diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat index b2bc81b15f8..d7a60b39b58 100644 --- a/src/include/catalog/pg_proc.dat +++ b/src/include/catalog/pg_proc.dat @@ -1505,38 +1505,12 @@ { oid => '745', descr => 'current user name', proname => 'current_user', provolatile => 's', prorettype => 'name', proargtypes => '', prosrc => 'current_user' }, -{ oid => '9695', descr => 'current role name', - proname => 'current_role', provolatile => 's', prorettype => 'name', - proargtypes => '', prosrc => 'current_user' }, -{ oid => '9696', descr => 'user name', - proname => 'user', provolatile => 's', prorettype => 'name', - proargtypes => '', prosrc => 'current_user' }, -{ oid => '9697', descr => 'name of the current database', - proname => 'current_catalog', provolatile => 's', prorettype => 'name', - proargtypes => '', prosrc => 'current_database' }, { oid => '746', descr => 'session user name', proname => 'session_user', provolatile => 's', prorettype => 'name', proargtypes => '', prosrc => 'session_user' }, { oid => '9977', descr => 'system user name', proname => 'system_user', provolatile => 's', prorettype => 'text', proargtypes => '', prosrc => 'system_user' }, -{ oid => '9978', descr => 'current date', - proname => 'current_date', provolatile => 's', prorettype => 'date', - proargtypes => '', prosrc => 'current_date' }, -{ oid => '9979', descr => 'current time', - proname => 'current_time', proisstrict => 'f', provolatile => 's', - prorettype => 'timetz', proargtypes => 'int4', prosrc => 'current_time' }, -{ oid => '9980', descr => 'current timestamp', - proname => 'current_timestamp', proisstrict => 'f', provolatile => 's', - prorettype => 'timestamptz', proargtypes => 'int4', - prosrc => 'current_timestamp' }, -{ oid => '9981', descr => 'local time', - proname => 'localtime', proisstrict => 'f', provolatile => 's', - prorettype => 'time', proargtypes => 'int4', prosrc => 'sql_localtime' }, -{ oid => '9982', descr => 'local timestamp', - proname => 'localtimestamp', proisstrict => 'f', provolatile => 's', - prorettype => 'timestamp', proargtypes => 'int4', - prosrc => 'sql_localtimestamp' }, { oid => '744', proname => 'array_eq', prorettype => 'bool', diff --git a/src/include/executor/execExpr.h b/src/include/executor/execExpr.h index 157b0d85f29..048573c2bcb 100644 --- a/src/include/executor/execExpr.h +++ b/src/include/executor/execExpr.h @@ -171,6 +171,7 @@ typedef enum ExprEvalOp EEOP_DISTINCT, EEOP_NOT_DISTINCT, EEOP_NULLIF, + EEOP_SQLVALUEFUNCTION, EEOP_CURRENTOFEXPR, EEOP_NEXTVALUEEXPR, EEOP_ARRAYEXPR, @@ -418,6 +419,12 @@ typedef struct ExprEvalStep FunctionCallInfo fcinfo_data_in; } iocoerce; + /* for EEOP_SQLVALUEFUNCTION */ + struct + { + SQLValueFunction *svf; + } sqlvaluefunction; + /* for EEOP_NEXTVALUEEXPR */ struct { @@ -769,6 +776,7 @@ extern void ExecEvalParamExec(ExprState *state, ExprEvalStep *op, ExprContext *econtext); extern void ExecEvalParamExtern(ExprState *state, ExprEvalStep *op, ExprContext *econtext); +extern void ExecEvalSQLValueFunction(ExprState *state, ExprEvalStep *op); extern void ExecEvalCurrentOfExpr(ExprState *state, ExprEvalStep *op); extern void ExecEvalNextValueExpr(ExprState *state, ExprEvalStep *op); extern void ExecEvalRowNull(ExprState *state, ExprEvalStep *op, diff --git a/src/include/nodes/primnodes.h b/src/include/nodes/primnodes.h index be9c29f0bfb..08e7dae73f1 100644 --- a/src/include/nodes/primnodes.h +++ b/src/include/nodes/primnodes.h @@ -1446,6 +1446,49 @@ typedef struct MinMaxExpr } MinMaxExpr; /* + * SQLValueFunction - parameterless functions with special grammar productions + * + * The SQL standard categorizes some of these as <datetime value function> + * and others as <general value specification>. We call 'em SQLValueFunctions + * for lack of a better term. We store type and typmod of the result so that + * some code doesn't need to know each function individually, and because + * we would need to store typmod anyway for some of the datetime functions. + * Note that currently, all variants return non-collating datatypes, so we do + * not need a collation field; also, all these functions are stable. + */ +typedef enum SQLValueFunctionOp +{ + SVFOP_CURRENT_DATE, + SVFOP_CURRENT_TIME, + SVFOP_CURRENT_TIME_N, + SVFOP_CURRENT_TIMESTAMP, + SVFOP_CURRENT_TIMESTAMP_N, + SVFOP_LOCALTIME, + SVFOP_LOCALTIME_N, + SVFOP_LOCALTIMESTAMP, + SVFOP_LOCALTIMESTAMP_N, + SVFOP_CURRENT_ROLE, + SVFOP_CURRENT_USER, + SVFOP_USER, + SVFOP_SESSION_USER, + SVFOP_CURRENT_CATALOG, + SVFOP_CURRENT_SCHEMA +} SQLValueFunctionOp; + +typedef struct SQLValueFunction +{ + Expr xpr; + SQLValueFunctionOp op; /* which function this is */ + /* + * Result type/typmod. Type is fully determined by "op", so no need to + * include this Oid in the query jumbling. + */ + Oid type pg_node_attr(query_jumble_ignore); + int32 typmod; + int location; /* token location, or -1 if unknown */ +} SQLValueFunction; + +/* * XmlExpr - various SQL/XML functions requiring special grammar productions * * 'name' carries the "NAME foo" argument (already XML-escaped). diff --git a/src/include/utils/date.h b/src/include/utils/date.h index 5fd886b3dba..97e1a021217 100644 --- a/src/include/utils/date.h +++ b/src/include/utils/date.h @@ -96,6 +96,7 @@ TimeTzADTPGetDatum(const TimeTzADT *X) /* date.c */ +extern int32 anytime_typmod_check(bool istz, int32 typmod); extern double date2timestamp_no_overflow(DateADT dateVal); extern Timestamp date2timestamp_opt_overflow(DateADT dateVal, int *overflow); extern TimestampTz date2timestamptz_opt_overflow(DateADT dateVal, int *overflow); @@ -103,6 +104,9 @@ extern int32 date_cmp_timestamp_internal(DateADT dateVal, Timestamp dt2); extern int32 date_cmp_timestamptz_internal(DateADT dateVal, TimestampTz dt2); extern void EncodeSpecialDate(DateADT dt, char *str); +extern DateADT GetSQLCurrentDate(void); +extern TimeTzADT *GetSQLCurrentTime(int32 typmod); +extern TimeADT GetSQLLocalTime(int32 typmod); extern int time2tm(TimeADT time, struct pg_tm *tm, fsec_t *fsec); extern int timetz2tm(TimeTzADT *time, struct pg_tm *tm, fsec_t *fsec, int *tzp); extern int tm2time(struct pg_tm *tm, fsec_t fsec, TimeADT *result); diff --git a/src/include/utils/timestamp.h b/src/include/utils/timestamp.h index edd59dc4322..c4dd96c8c97 100644 --- a/src/include/utils/timestamp.h +++ b/src/include/utils/timestamp.h @@ -95,7 +95,11 @@ extern PGDLLIMPORT TimestampTz PgReloadTime; /* Internal routines (not fmgr-callable) */ +extern int32 anytimestamp_typmod_check(bool istz, int32 typmod); + extern TimestampTz GetCurrentTimestamp(void); +extern TimestampTz GetSQLCurrentTimestamp(int32 typmod); +extern Timestamp GetSQLLocalTimestamp(int32 typmod); extern void TimestampDifference(TimestampTz start_time, TimestampTz stop_time, long *secs, int *microsecs); extern long TimestampDifferenceMilliseconds(TimestampTz start_time, |