31{
34 int nargs;
38 bool newdtnull;
44
46
47 elog(
ERROR,
"moddatetime: not fired by trigger manager");
48
50
51 elog(
ERROR,
"moddatetime: must be fired for row");
52
54
55 elog(
ERROR,
"moddatetime: must be fired before event");
56
58
59 elog(
ERROR,
"moddatetime: cannot process INSERT events");
62 else
63
64 elog(
ERROR,
"moddatetime: cannot process DELETE events");
65
68
70
72
73 if (nargs != 1)
74
76
77 args = trigger->tgargs;
78
79 tupdesc = rel->rd_att;
80
81
82
83
84
86
87
88
89
90
93 (
errcode(ERRCODE_TRIGGERED_ACTION_EXCEPTION),
94 errmsg(
"\"%s\" has no attribute \"%s\"",
96
97
98
99
100
102 if (atttypid == TIMESTAMPOID)
107 else if (atttypid == TIMESTAMPTZOID)
112 else
113 {
115 (
errcode(ERRCODE_TRIGGERED_ACTION_EXCEPTION),
116 errmsg(
"attribute \"%s\" of \"%s\" must be type TIMESTAMP or TIMESTAMPTZ",
119 }
120 newdtnull = false;
121
122
124 1, &
attnum, &newdt, &newdtnull);
125
126
128
130}
Datum timestamp_in(PG_FUNCTION_ARGS)
Datum timestamptz_in(PG_FUNCTION_ARGS)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
#define DirectFunctionCall3(func, arg1, arg2, arg3)
HeapTuple heap_modify_tuple_by_cols(HeapTuple tuple, TupleDesc tupleDesc, int nCols, const int *replCols, const Datum *replValues, const bool *replIsnull)
if(TABLE==NULL||TABLE_index==NULL)
void pfree(void *pointer)
static Datum PointerGetDatum(const void *X)
static Datum ObjectIdGetDatum(Oid X)
static Datum CStringGetDatum(const char *X)
static Datum Int32GetDatum(int32 X)
int SPI_fnumber(TupleDesc tupdesc, const char *fname)
Oid SPI_gettypeid(TupleDesc tupdesc, int fnumber)
char * SPI_getrelname(Relation rel)
#define TRIGGER_FIRED_BEFORE(event)
#define CALLED_AS_TRIGGER(fcinfo)
#define TRIGGER_FIRED_FOR_ROW(event)
#define TRIGGER_FIRED_BY_INSERT(event)
#define TRIGGER_FIRED_BY_UPDATE(event)