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