Tighten handling of "ago" in interval values
authorMichael Paquier <michael@paquier.xyz>
Mon, 28 Aug 2023 04:49:55 +0000 (13:49 +0900)
committerMichael Paquier <michael@paquier.xyz>
Mon, 28 Aug 2023 04:49:55 +0000 (13:49 +0900)
This commit Restrict the unit "ago" to only appear at the end of the
interval.  According to the documentation, a direction can only be
defined at the end of an interval, but it was possible to define it in
the middle of the string or define it multiple times.

In spirit, this is similar to the error handling improvements done in
5b3c5953553b or bcc704b524904.

Author: Joseph Koshakow
Reviewed-by: Jacob Champion, Gurjeet Singh, Reid Thompson
Discussion: https://postgr.es/m/CAAvxfHd-yNO+XYnUxL=GaNZ1n+eE0V-oE0+-cC1jdjdU0KS3iw@mail.gmail.com

src/backend/utils/adt/datetime.c
src/test/regress/expected/interval.out
src/test/regress/sql/interval.sql

index 2a5dddc43f37af2df4645c973981b21501929118..178b3f47803a2b0801eb766d7e6fe62aab60eb82 100644 (file)
@@ -3578,6 +3578,13 @@ DecodeInterval(char **field, int *ftype, int nf, int range,
                                                break;
 
                                        case AGO:
+
+                                               /*
+                                                * "ago" is only allowed to appear at the end of the
+                                                * interval.
+                                                */
+                                               if (i != nf - 1)
+                                                       return DTERR_BAD_FORMAT;
                                                is_before = true;
                                                type = uval;
                                                break;
index 28b71d9681784da6714c8fa3f6a37d850d7d62fa..01d43b58687c3c49f51c6c1a44f60aafdaaeae3f 100644 (file)
@@ -1787,3 +1787,12 @@ SELECT extract(epoch from interval '1000000000 days');
  86400000000000.000000
 (1 row)
 
+-- "ago" can only appear once at the end of an interval.
+SELECT INTERVAL '42 days 2 seconds ago ago';
+ERROR:  invalid input syntax for type interval: "42 days 2 seconds ago ago"
+LINE 1: SELECT INTERVAL '42 days 2 seconds ago ago';
+                        ^
+SELECT INTERVAL '2 minutes ago 5 days';
+ERROR:  invalid input syntax for type interval: "2 minutes ago 5 days"
+LINE 1: SELECT INTERVAL '2 minutes ago 5 days';
+                        ^
index 56feda1a3d85f27aba5586d852efcd0ed95b50aa..fb1ef3049048516aee383dd5602442e4ae332d47 100644 (file)
@@ -582,3 +582,7 @@ SELECT f1,
 
 -- internal overflow test case
 SELECT extract(epoch from interval '1000000000 days');
+
+-- "ago" can only appear once at the end of an interval.
+SELECT INTERVAL '42 days 2 seconds ago ago';
+SELECT INTERVAL '2 minutes ago 5 days';