Changeset: 481953652537 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/481953652537
Branch: default
Log Message:

Merge with Aug2024 branch.


diffs (142 lines):

diff --git a/sql/backends/monet5/UDF/pyapi3/conversion3.c 
b/sql/backends/monet5/UDF/pyapi3/conversion3.c
--- a/sql/backends/monet5/UDF/pyapi3/conversion3.c
+++ b/sql/backends/monet5/UDF/pyapi3/conversion3.c
@@ -136,11 +136,9 @@ PyMaskedArray_FromBAT(PyInput *inp, size
        bool bnonil = b->tnonil;
        MT_lock_unset(&b->theaplock);
        if (!bnonil) {
-               PyObject *nme = PyUnicode_FromString("numpy.ma");
-               PyObject *mod = PyImport_Import(nme);
+               PyObject *mod = PyImport_ImportModule("numpy.ma");
                PyObject *mafunc = PyObject_GetAttrString( mod, "masked_array");
                PyObject *nullmask = PyNullMask_FromBAT(b, t_start, t_end);
-               Py_DECREF(nme);
 
                if (!nullmask) {
                        Py_DECREF(vararray);
@@ -283,8 +281,10 @@ PyArrayObject_FromBAT(PyInput *inp, size
                                        j = 0;
                                        BATloop(b, p, q)
                                        {
-                                               const date* dt = (const 
date*)BUNtail(li, p);
-                                               data[j++] = 
PyDate_FromDate(date_year(*dt), date_month(*dt), date_day(*dt));
+                                               date dt = *(const 
date*)BUNtail(li, p);
+                                               if (is_date_nil(dt))
+                                                       dt = date_create(1, 1, 
1);
+                                               data[j++] = 
PyDate_FromDate(date_year(dt), date_month(dt), date_day(dt));
                                        }
                                }
                                bat_iterator_end(&li);
@@ -301,11 +301,13 @@ PyArrayObject_FromBAT(PyInput *inp, size
                                        j = 0;
                                        BATloop(b, p, q)
                                        {
-                                               const daytime* dt = (const 
daytime*)BUNtail(li, p);
-                                               data[j++] = 
PyTime_FromTime(daytime_hour(*dt),
-                                                                               
                        daytime_min(*dt),
-                                                                               
                        daytime_sec(*dt),
-                                                                               
                        daytime_usec(*dt));
+                                               daytime dt = *(const 
daytime*)BUNtail(li, p);
+                                               if (is_daytime_nil(dt))
+                                                       dt = daytime_create(0, 
0, 0, 0);
+                                               data[j++] = 
PyTime_FromTime(daytime_hour(dt),
+                                                                               
                        daytime_min(dt),
+                                                                               
                        daytime_sec(dt),
+                                                                               
                        daytime_usec(dt));
                                        }
                                }
                                bat_iterator_end(&li);
@@ -322,9 +324,9 @@ PyArrayObject_FromBAT(PyInput *inp, size
                                        j = 0;
                                        BATloop(b, p, q)
                                        {
-                                               const timestamp* ts = (const 
timestamp*)BUNtail(li, p);
-                                               const date dt = 
timestamp_date(*ts);
-                                               const daytime dtm = 
timestamp_daytime(*ts);
+                                               const timestamp ts = *(const 
timestamp*)BUNtail(li, p);
+                                               const date dt = 
is_timestamp_nil(ts) ? date_create(1, 1, 1) : timestamp_date(ts);
+                                               const daytime dtm = 
is_timestamp_nil(ts) ? daytime_create(0, 0, 0, 0) : timestamp_daytime(ts);
 
                                                data[j++] = 
PyDateTime_FromDateAndTime(date_year(dt), date_month(dt), date_day(dt), 
daytime_hour(dtm), daytime_min(dtm), daytime_sec(dtm), daytime_usec(dtm));
                                        }
diff --git a/sql/backends/monet5/UDF/pyapi3/pyapi3.c 
b/sql/backends/monet5/UDF/pyapi3/pyapi3.c
--- a/sql/backends/monet5/UDF/pyapi3/pyapi3.c
+++ b/sql/backends/monet5/UDF/pyapi3/pyapi3.c
@@ -662,7 +662,6 @@ PYAPI3PyAPIprelude(void) {
                wchar_t* program = L"mserver5";
                wchar_t* argv[] = { program, NULL };
                str msg = MAL_SUCCEED;
-               PyObject *tmp;
 
                static_assert(PY_MAJOR_VERSION == 3, "Python 3.X required");
 #if PY_MINOR_VERSION >= 11
@@ -705,10 +704,8 @@ PYAPI3PyAPIprelude(void) {
                }
                _pytypes_init();
                _loader_init();
-               tmp = PyUnicode_FromString("marshal");
-               marshal_module = PyImport_Import(tmp);
+               marshal_module = PyImport_ImportModule("marshal");
                init_DateTimeAPI();
-               Py_DECREF(tmp);
                if (marshal_module == NULL) {
                        MT_lock_unset(&pyapiLock);
                        return createException(MAL, "pyapi3.eval", 
SQLSTATE(PY000) "Failed to load Marshal module.");
diff --git a/sql/server/rel_statistics_functions.c 
b/sql/server/rel_statistics_functions.c
--- a/sql/server/rel_statistics_functions.c
+++ b/sql/server/rel_statistics_functions.c
@@ -132,16 +132,16 @@ sql_sub_propagate_statistics(mvc *sql, s
 
                                switch (t1->type->eclass) {
                                case EC_DATE: {
-                                       res1 = atom_int(sql->sa, 
sql_bind_localtype("int"), date_diff_imp((date)lmax->data.val.ival, 
(date)rmin->data.val.ival));
-                                       res2 = atom_int(sql->sa, 
sql_bind_localtype("int"), date_diff_imp((date)lmin->data.val.ival, 
(date)rmax->data.val.ival));
+                                       res1 = atom_int(sql->sa, 
exp_subtype(e), date_diff_imp((date)lmax->data.val.ival, 
(date)rmin->data.val.ival));
+                                       res2 = atom_int(sql->sa, 
exp_subtype(e), date_diff_imp((date)lmin->data.val.ival, 
(date)rmax->data.val.ival));
                                } break;
                                case EC_TIME: {
-                                       res1 = atom_int(sql->sa, 
sql_bind_localtype("lng"), daytime_diff((daytime)lmax->data.val.lval, 
(daytime)rmin->data.val.lval));
-                                       res2 = atom_int(sql->sa, 
sql_bind_localtype("lng"), daytime_diff((daytime)lmin->data.val.lval, 
(daytime)rmax->data.val.lval));
+                                       res1 = atom_int(sql->sa, 
exp_subtype(e), daytime_diff((daytime)lmax->data.val.lval, 
(daytime)rmin->data.val.lval));
+                                       res2 = atom_int(sql->sa, 
exp_subtype(e), daytime_diff((daytime)lmin->data.val.lval, 
(daytime)rmax->data.val.lval));
                                } break;
                                case EC_TIMESTAMP: {
-                                       res1 = atom_int(sql->sa, 
sql_bind_localtype("lng"), TSDIFF((timestamp)lmax->data.val.lval, 
(timestamp)rmin->data.val.lval));
-                                       res2 = atom_int(sql->sa, 
sql_bind_localtype("lng"), TSDIFF((timestamp)lmin->data.val.lval, 
(timestamp)rmax->data.val.lval));
+                                       res1 = atom_int(sql->sa, 
exp_subtype(e), TSDIFF((timestamp)lmax->data.val.lval, 
(timestamp)rmin->data.val.lval));
+                                       res2 = atom_int(sql->sa, 
exp_subtype(e), TSDIFF((timestamp)lmin->data.val.lval, 
(timestamp)rmax->data.val.lval));
                                } break;
                                default:
                                        break;
@@ -604,7 +604,7 @@ sql_day_propagate_statistics(mvc *sql, s
        set_minmax_property(sql, e, PROP_MAX, atom_int(sql->sa, 
sql_bind_localtype(localtype), nmax));
        set_minmax_property(sql, e, PROP_MIN, atom_int(sql->sa, 
sql_bind_localtype(localtype), nmin));
        prop *p = e->p = prop_create(sql->sa, PROP_NUNIQUES, e->p);
-       p->value.dval = 31;
+       p->value.dval = nmax - nmin + 1;
 }
 
 static void
diff --git a/sql/test/BugTracker-2024/Tests/7580-date-diff.test 
b/sql/test/BugTracker-2024/Tests/7580-date-diff.test
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2024/Tests/7580-date-diff.test
@@ -0,0 +1,10 @@
+
+query IIIIII
+select t.d1, t.d2
+, cast(extract(day from (t.d1 - t.d2)) as integer) as verschil
+, cast(extract(day from (t.d1 - t.d2)) as integer) < 100 as f -- false
+, cast(extract(day from (t.d1 - t.d2)) as integer) >=100 as t -- true
+, case when cast(extract(day from (t.d1 - t.d2)) as integer) < 100 then 
'false' else 'true' end as true_or_false -- false
+from (select cast('2024-01-18' as date) as d1, cast('2013-06-06' as date) as 
d2) t
+where abs(cast(extract(day from (t.d1 - t.d2)) as integer)) < 100 -- this is 
false, not true, so this shouldn't produce any result.
+----
diff --git a/sql/test/BugTracker-2024/Tests/All 
b/sql/test/BugTracker-2024/Tests/All
--- a/sql/test/BugTracker-2024/Tests/All
+++ b/sql/test/BugTracker-2024/Tests/All
@@ -90,3 +90,4 @@ 7563-is-distinct-from
 7572-max-length-changes
 7570-timestamp-str
 7574-startswith-bug
+7580-date-diff
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to