Changeset: 1a8069c5af92 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/1a8069c5af92
Modified Files:
        gdk/gdk_batop.c
        gdk/gdk_group.c
        sql/backends/monet5/generator/generator.c
        sql/server/rel_dump.c
        sql/server/rel_unnest.c
Branch: pp_hashjoin
Log Message:

merged with default


diffs (truncated from 687 to 300 lines):

diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -3247,12 +3247,14 @@ BATcount_no_nil(BAT *b, BAT *s)
                return ci.ncand;
        }
        if (BATcheckhash(b)) {
+               MT_rwlock_rdlock(&b->thashlock);
                BUN p = 0;
                const void *nil = ATOMnilptr(b->ttype);
                cnt = ci.ncand;
                HASHloop(&bi, b->thash, p, nil)
                        if (canditer_contains(&ci, p + b->hseqbase))
                                cnt--;
+               MT_rwlock_rdunlock(&b->thashlock);
                bat_iterator_end(&bi);
                return cnt;
        }
diff --git a/gdk/gdk_group.c b/gdk/gdk_group.c
--- a/gdk/gdk_group.c
+++ b/gdk/gdk_group.c
@@ -1320,7 +1320,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
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to