Changeset: 3172b54b8908 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/3172b54b8908
Modified Files:
gdk/gdk_group.c
Branch: ustr
Log Message:
Merge with default branch.
diffs (truncated from 669 to 300 lines):
diff --git a/gdk/gdk_group.c b/gdk/gdk_group.c
--- a/gdk/gdk_group.c
+++ b/gdk/gdk_group.c
@@ -1317,7 +1317,9 @@ BATgroup_internal(BAT **groups, BAT **ex
gn->tunique_est = (double)ngrp;
*groups = gn;
if (!g && !e && !s) {
+ MT_lock_set(&b->theaplock);
b->tunique_est = (double)ngrp;
+ MT_lock_unset(&b->theaplock);
}
TRC_DEBUG(ALGO, "b=" ALGOBATFMT ",s=" ALGOOPTBATFMT
",g=" ALGOOPTBATFMT ",e=" ALGOOPTBATFMT
diff --git a/gdk/gdk_time.c b/gdk/gdk_time.c
--- a/gdk/gdk_time.c
+++ b/gdk/gdk_time.c
@@ -12,38 +12,30 @@
#include "gdk.h"
#include "gdk_time.h"
-#define YEAR_MIN (-4712) /* 4713 BC */
+/* layout of a `date`:
+ * bottom 5 bits: day number minus 1 (i.e. 0..27/28/29/30 depending on month)
+ * next 21 bits: (year + 4712) * 12 + month
+ * where month is 0 based (i.e. counting months since -4712)
+ * i.e. 000000mmmmmmmmmmmmmmmmmmmmmddddd
+ *
+ * A `daytime` is the number of microseconds since midnight
+ * (i.e. max is 24*60*60*1000000 which requires 37 bits out of 64)
+ *
+ * layout of a `timestamp`
+ * bottom 37 bits: `daytime`
+ * next 26 bits: `date` (21 bits months since -4712 and 5 bits day number)
+ * (i.e. 0mmmmmmmmmmmmmmmmmmmmmdddddttttttttttttttttttttttttttttttttttttt)
+ */
-#define YEAR_OFFSET (-YEAR_MIN)
-#define DTDAY_WIDTH 5 /* 1..28/29/30/31, depending on
month/year */
-#define DTDAY_SHIFT 0
-#define DTMONTH_WIDTH 21 /* enough for 174761 years (and 8
months) */
+#define YEAR_MIN (-4712) /* 4713 BC */
+
+#define YEAR_OFFSET (-YEAR_MIN)
+#define DTDAY_WIDTH 5 /* 1..28/29/30/31, depending on month/year */
+#define DTDAY_SHIFT 0
+#define DTMONTH_WIDTH 21 /* enough for 174761 years (and 8 months) */
#define DTMONTH_SHIFT (DTDAY_WIDTH+DTDAY_SHIFT)
-#define YEAR_MAX (YEAR_MIN+(1<<DTMONTH_WIDTH)/12-1)
-
-#define isdate(y, m, d) ((m) > 0 && (m) <= 12 && (d) > 0 && (y) >=
YEAR_MIN && (y) <= YEAR_MAX && (d) <= monthdays(y, m))
-#define mkdate(y, m, d) ((date) (((uint32_t) (((y) + YEAR_OFFSET) * 12
+ (m) - 1) << DTMONTH_SHIFT) \
- | ((uint32_t) (d) << DTDAY_SHIFT)))
-#define date_extract_day(dt) ((int) (((uint32_t) (dt) >> DTDAY_SHIFT) & ((1
<< DTDAY_WIDTH) - 1)))
-#define date_extract_month(dt) ((int) ((((uint32_t) (dt) >> DTMONTH_SHIFT) &
((1 << DTMONTH_WIDTH) - 1)) % 12 + 1))
-#define date_extract_year(dt) ((int) ((((uint32_t) (dt) >> DTMONTH_SHIFT) &
((1 << DTMONTH_WIDTH) - 1)) / 12 - YEAR_OFFSET))
-
-#define istime(h,m,s,u) ((h) >= 0 && (h) < 24 && (m) >= 0 && (m) < 60
&& (s) >= 0 && (s) <= 60 && (u) >= 0 && (u) < 1000000)
-#define mkdaytime(h,m,s,u) (((((daytime) (h) * 60 + (m)) * 60) + (s)) *
LL_CONSTANT(1000000) + (u))
-
-#define daytime_extract_hour(tm) ((int) (tm / HOUR_USEC))
-#define daytime_extract_minute(tm) ((int) ((tm / 60000000) % 60))
-#define daytime_extract_usecond(tm) ((int) (tm % 60000000)) /* includes
seconds */
-
-#define TSTIME_WIDTH 37 /* [0..24*60*60*1000000) */
-#define TSTIME_SHIFT 0
-#define TSDATE_WIDTH (DTDAY_WIDTH+DTMONTH_WIDTH)
-#define TSDATE_SHIFT (TSTIME_SHIFT+TSTIME_WIDTH)
-#define ts_time(ts) ((daytime) (((uint64_t) (ts) >> TSTIME_SHIFT) &
((LL_CONSTANT(1) << TSTIME_WIDTH) - 1)))
-#define ts_date(ts) ((date) (((uint64_t) (ts) >> TSDATE_SHIFT) &
((1 << TSDATE_WIDTH) - 1)))
-#define mktimestamp(d, t) ((timestamp) (((uint64_t) (d) << TSDATE_SHIFT)
| \
- ((uint64_t) (t) << TSTIME_SHIFT)))
+#define YEAR_MAX (YEAR_MIN+(1<<DTMONTH_WIDTH)/12-1)
static const int leapdays[13] = { /* days per month in leap year */
0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
@@ -51,10 +43,119 @@ static const int leapdays[13] = { /* day
static const int cumdays[13] = { /* cumulative days in non leap year */
0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365
};
-#define isleapyear(y) ((y) % 4 == 0 && ((y) % 100 != 0 || (y) % 400
== 0))
-#define monthdays(y, m) (leapdays[m] - ((m) == 2 &&
!isleapyear(y)))
+
+__attribute__((__const__))
+static inline bool
+isleapyear(int y)
+{
+ return y % 4 == 0 && (y % 100 != 0 || y % 400 == 0);
+}
+
+__attribute__((__const__))
+static inline int
+monthdays(int y, int m)
+{
+ return leapdays[m] - (m == 2 && !isleapyear(y));
+}
+
+__attribute__((__const__))
+static inline bool
+isdate(int y, int m, int d)
+{
+ return m > 0 && m <= 12 && d > 0 && y >= YEAR_MIN && y <= YEAR_MAX && d
<= monthdays(y, m);
+}
+
+__attribute__((__const__))
+static inline date
+mkdate(int y, int m, int d)
+{
+ return (date) (((uint32_t) ((y + YEAR_OFFSET) * 12 + m - 1) <<
DTMONTH_SHIFT) | ((uint32_t) d << DTDAY_SHIFT));
+}
+
+__attribute__((__const__))
+static inline int
+date_extract_day(date dt)
+{
+ return (int) (((uint32_t) dt >> DTDAY_SHIFT) & ((1 << DTDAY_WIDTH) -
1));
+}
+
+__attribute__((__const__))
+static inline int
+date_extract_month(date dt)
+{
+ return (int) ((((uint32_t) dt >> DTMONTH_SHIFT) & ((1 << DTMONTH_WIDTH)
- 1)) % 12 + 1);
+}
+
+__attribute__((__const__))
+static inline int
+date_extract_year(date dt)
+{
+ return (int) ((((uint32_t) dt >> DTMONTH_SHIFT) & ((1 << DTMONTH_WIDTH)
- 1)) / 12 - YEAR_OFFSET);
+}
+
+__attribute__((__const__))
+static inline bool
+istime(int h, int m, int s, int u)
+{
+ return h >= 0 && h < 24 && m >= 0 && m < 60 && s >= 0 && s <= 60 && u
>= 0 && u < 1000000;
+}
-const timestamp unixepoch = mktimestamp(mkdate(1970, 1, 1), mkdaytime(0, 0, 0,
0));
+__attribute__((__const__))
+static inline daytime
+mkdaytime(int h, int m, int s, int u)
+{
+ return ((((daytime) h * 60 + m) * 60) + s) * LL_CONSTANT(1000000) + u;
+}
+
+__attribute__((__const__))
+static inline int
+daytime_extract_hour(daytime tm)
+{
+ return (int) (tm / HOUR_USEC);
+}
+
+__attribute__((__const__))
+static inline int
+daytime_extract_minute(daytime tm)
+{
+ return (int) ((tm / 60000000) % 60);
+}
+
+__attribute__((__const__))
+static inline int
+daytime_extract_usecond(daytime tm)
+{
+ return (int) (tm % 60000000); /* includes seconds */
+}
+
+#define TSTIME_WIDTH 37 /* [0..24*60*60*1000000) */
+#define TSTIME_SHIFT 0
+#define TSDATE_WIDTH (DTDAY_WIDTH+DTMONTH_WIDTH)
+#define TSDATE_SHIFT (TSTIME_SHIFT+TSTIME_WIDTH)
+
+__attribute__((__const__))
+static inline daytime
+ts_time(timestamp ts)
+{
+ return (daytime) (((uint64_t) ts >> TSTIME_SHIFT) & ((LL_CONSTANT(1) <<
TSTIME_WIDTH) - 1));
+}
+
+__attribute__((__const__))
+static inline date
+ts_date(timestamp ts)
+{
+ return (date) (((uint64_t) ts >> TSDATE_SHIFT) & ((1 << TSDATE_WIDTH) -
1));
+}
+
+__attribute__((__const__))
+static inline timestamp
+mktimestamp(date d, daytime t)
+{
+ return (timestamp) (((uint64_t) d << TSDATE_SHIFT) |
+ ((uint64_t) t << TSTIME_SHIFT));
+}
+
+const timestamp unixepoch = (((((timestamp) 1970 + YEAR_OFFSET) * 12) <<
DTMONTH_SHIFT) | ((timestamp) 1 << DTDAY_SHIFT)) << TSDATE_SHIFT; /*
mktimestamp(mkdate(1970, 1, 1), mkdaytime(0, 0, 0, 0)) */
date
date_create(int year, int month, int day)
diff --git a/sql/backends/monet5/generator/Tests/generator00.test
b/sql/backends/monet5/generator/Tests/generator00.test
--- a/sql/backends/monet5/generator/Tests/generator00.test
+++ b/sql/backends/monet5/generator/Tests/generator00.test
@@ -38,6 +38,12 @@ select * from generate_series(0,10,2) wh
4
query I rowsort
+select * from sys.generate_series(10,0,-3) where value < 6
+----
+1
+4
+
+query I rowsort
select * from generate_series(0,10,2) where value =4
----
4
diff --git a/sql/backends/monet5/generator/Tests/generator03.test
b/sql/backends/monet5/generator/Tests/generator03.test
--- a/sql/backends/monet5/generator/Tests/generator03.test
+++ b/sql/backends/monet5/generator/Tests/generator03.test
@@ -66,6 +66,7 @@ select * from generate_series(
cast( '-10' as interval hour))
where value < timestamp '2008-03-02 00:00'
----
+2008-03-01 04:00:00
2008-03-01 14:00:00
query T rowsort
diff --git a/sql/backends/monet5/generator/Tests/generator05.test
b/sql/backends/monet5/generator/Tests/generator05.test
--- a/sql/backends/monet5/generator/Tests/generator05.test
+++ b/sql/backends/monet5/generator/Tests/generator05.test
@@ -6,6 +6,7 @@ select * from generate_series(date '2023
2023-03-01
2023-04-01
2023-05-01
+2023-06-01
query T nosort
select * from generate_series(date '2023-01-01',date '2024-01-01', interval
'15' day) where value < date '2023-06-06'
@@ -22,3 +23,163 @@ select * from generate_series(date '2023
2023-05-16
2023-05-31
+query T rowsort
+select * from sys.generate_series(date '2026-04-1',date '2026-01-10', interval
-'1' month)
+----
+2026-02-01
+2026-03-01
+2026-04-01
+
+query T rowsort
+select * from sys.generate_series(date '2026-04-1',date '2026-01-10', interval
-'1' day)
+----
+2026-01-11
+2026-01-12
+2026-01-13
+2026-01-14
+2026-01-15
+2026-01-16
+2026-01-17
+2026-01-18
+2026-01-19
+2026-01-20
+2026-01-21
+2026-01-22
+2026-01-23
+2026-01-24
+2026-01-25
+2026-01-26
+2026-01-27
+2026-01-28
+2026-01-29
+2026-01-30
+2026-01-31
+2026-02-01
+2026-02-02
+2026-02-03
+2026-02-04
+2026-02-05
+2026-02-06
+2026-02-07
+2026-02-08
+2026-02-09
+2026-02-10
+2026-02-11
+2026-02-12
+2026-02-13
+2026-02-14
+2026-02-15
+2026-02-16
+2026-02-17
+2026-02-18
+2026-02-19
+2026-02-20
+2026-02-21
+2026-02-22
+2026-02-23
+2026-02-24
+2026-02-25
+2026-02-26
+2026-02-27
+2026-02-28
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]