From 81fee7373b7ecd034a4616ed69c07e5ff455ae86 Mon Sep 17 00:00:00 2001 From: lvhui Date: Mon, 19 Sep 2022 01:44:48 -0700 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dpg=5Fget=5Ftabledef=E5=AF=B9o?= =?UTF-8?q?n=20update=20timestamp=E5=B1=9E=E4=BA=8E=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=EF=BC=8C=E8=A1=A8=E8=BE=BE=E5=BC=8F=E8=BD=AC=E6=8D=A2=E5=85=B3?= =?UTF-8?q?=E9=94=AE=E5=AD=97=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/backend/utils/adt/ruleutils.cpp | 35 +++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/src/common/backend/utils/adt/ruleutils.cpp b/src/common/backend/utils/adt/ruleutils.cpp index f5e642d11..386661f22 100644 --- a/src/common/backend/utils/adt/ruleutils.cpp +++ b/src/common/backend/utils/adt/ruleutils.cpp @@ -1645,7 +1645,40 @@ static int get_table_attribute( appendStringInfo(buf, " DEFAULT %s", adsrc); } if (isOnUpdate) { - appendStringInfo(buf, " ON UPDATE %s", TextDatumGetCString(onUpdateExpr)); + if (pg_strcasecmp(TextDatumGetCString(onUpdateExpr), "pg_systimestamp()") == 0) { + appendStringInfo(buf, " ON UPDATE CURRENT_TIMESTAMP"); + } else if (pg_strcasecmp(TextDatumGetCString(onUpdateExpr), "('now'::text)::time with time zone") == 0) { + appendStringInfo(buf, " ON UPDATE CURRENT_TIME"); + } else if (pg_strcasecmp(TextDatumGetCString(onUpdateExpr), "text_date('now'::text)") == 0) { + appendStringInfo(buf, " ON UPDATE CURRENT_DATE"); + } else if (pg_strcasecmp(TextDatumGetCString(onUpdateExpr), "('now'::text)::time without time zone") == 0) { + appendStringInfo(buf, " ON UPDATE LOCALTIME"); + } else if (pg_strcasecmp(TextDatumGetCString(onUpdateExpr), "('now'::text)::timestamp without time zone") == 0) { + appendStringInfo(buf, " ON UPDATE LOCALTIMESTAMP"); + } else { + char* size_start = NULL; + char* size_end = NULL; + int number_size = 0; + size_start = strstr(TextDatumGetCString(onUpdateExpr), "timestamp("); + if (size_start != NULL) { + size_start = size_start + 10; + size_end = strstr(size_start, ")"); + number_size = size_end - size_start; + char num[number_size + 1] = {0}; + strncpy(num, size_start, number_size); + appendStringInfo(buf, " ON UPDATE CURRENT_TIMESTAMP(%s)", num); + } else { + size_start = strstr(TextDatumGetCString(onUpdateExpr), "time("); + if (size_start != NULL) { + size_start = size_start + 5; + size_end = strstr(size_start, ")"); + number_size = size_end - size_start; + char num[number_size + 1] = {0}; + strncpy(num, size_start, number_size); + appendStringInfo(buf, " ON UPDATE CURRENT_TIME(%s)", num); + } + } + } } break; }