Changeset: 9776e96ab0e4 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/9776e96ab0e4
Modified Files:
        gdk/ChangeLog
        gdk/gdk_time.c
        sql/test/pg_regress/Tests/date.test
Branch: default
Log Message:

Implemented BC/AD (and BCE/CE) suffixes when parsing dates.
Note, pymonetdb cannot handle negative years in dates.


diffs (120 lines):

diff --git a/gdk/ChangeLog b/gdk/ChangeLog
--- a/gdk/ChangeLog
+++ b/gdk/ChangeLog
@@ -1,6 +1,9 @@
 # ChangeLog file for GDK
 # This file is updated with Maddlog
 
+* Wed Jul 13 2022 Sjoerd Mullender <sjo...@acm.org>
+- Implemented BC/AD (and BCE/CE) suffixes when parsing dates.
+
 * Thu Jun  2 2022 Panagiotis Koutsourakis <kutsu...@monetdbsolutions.com>
 - The interface for using strimps has not changed (create an imprint index
   on a column of a read only table), but now construction happens at the
diff --git a/gdk/gdk_time.c b/gdk/gdk_time.c
--- a/gdk/gdk_time.c
+++ b/gdk/gdk_time.c
@@ -550,12 +550,12 @@ parse_date(const char *buf, date *d, boo
        if (external && strncmp(buf, "nil", 3) == 0)
                return 3;
        if ((yearneg = (buf[0] == '-')))
-               buf++;
-       if (!yearneg && !GDKisdigit(buf[0])) {
+               pos++;
+       if (!yearneg && !GDKisdigit(buf[pos])) {
                yearlast = true;
                sep = ' ';
        } else {
-               for (pos = 0; GDKisdigit(buf[pos]); pos++) {
+               for (; GDKisdigit(buf[pos]); pos++) {
                        year = (buf[pos] - '0') + year * 10;
                        if (year > YEAR_MAX)
                                break;
@@ -610,13 +610,35 @@ parse_date(const char *buf, date *d, boo
                                break;
                }
        }
+       if (!yearneg && buf[pos] == ' ') {
+               ssize_t opos = pos;
+               while (buf[++pos] == ' ')
+                       ;
+               if (strncasecmp(buf + pos, "BCE", 3) == 0) {
+                       /* Before Common Era */
+                       yearneg = true;
+                       pos += 3;
+               } else if (strncasecmp(buf + pos, "BC", 2) == 0) {
+                       /* Before Christ */
+                       yearneg = true;
+                       pos += 2;
+               } else if (strncasecmp(buf + pos, "CE", 2) == 0) {
+                       /* Common Era */
+                       pos += 2;
+               } else if (strncasecmp(buf + pos, "AD", 2) == 0) {
+                       /* Anno Domino */
+                       pos += 2;
+               } else {
+                       pos = opos;
+               }
+       }
        /* handle semantic error here */
        *d = date_create(yearneg ? -year : year, month, day);
        if (is_date_nil(*d)) {
                GDKerror("Semantic error in date.\n");
                return -1;
        }
-       return pos + yearneg;
+       return pos;
 }
 
 ssize_t
diff --git a/sql/test/pg_regress/Tests/date.test 
b/sql/test/pg_regress/Tests/date.test
--- a/sql/test/pg_regress/Tests/date.test
+++ b/sql/test/pg_regress/Tests/date.test
@@ -1270,10 +1270,8 @@ SELECT date '1999.008'
 statement error
 SELECT date 'J2451187'
 
-query T rowsort
+statement error
 SELECT date 'January 8, 99 BC'
-----
-0099-01-08
 
 query T rowsort
 SELECT date '99-Jan-08'
@@ -1443,17 +1441,17 @@ SELECT sql_add(current_date, 24*60*60.0)
 query I rowsort
 SELECT EXTRACT(CENTURY FROM DATE '0101-12-31 BC')
 ----
-2
+-2
 
 query I rowsort
 SELECT EXTRACT(CENTURY FROM DATE '0100-12-31 BC')
 ----
-1
+-1
 
 query I rowsort
 SELECT EXTRACT(CENTURY FROM DATE '0001-12-31 BC')
 ----
-1
+-1
 
 query I rowsort
 SELECT EXTRACT(CENTURY FROM DATE '0001-01-01')
@@ -1537,12 +1535,12 @@ 0
 query I rowsort
 SELECT EXTRACT(DECADE FROM DATE '0011-01-01 BC')
 ----
-1
+-1
 
 query I rowsort
 SELECT EXTRACT(DECADE FROM DATE '0012-12-31 BC')
 ----
-1
+-1
 
 statement error
 SELECT EXTRACT(CENTURY FROM NOW())>=21 AS True
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to