Changeset: 29486adb8cba for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/29486adb8cba
Modified Files:
        sql/server/sql_env.c
        sql/server/sql_mvc.c
        sql/server/sql_mvc.h
        
sql/test/BugDay_2005-10-06_2.9.3/Tests/CrashMe_SQL_server_crash-2.SF-921673.test
        sql/test/Dependencies/Tests/dependency_owner_schema_3.test
        sql/test/bugs/Tests/innerjoin_multiple-bug-sf-943661.test
Branch: ordered-set-aggregates
Log Message:

merged with default


diffs (truncated from 27932 to 300 lines):

diff --git a/clients/mapiclient/mhelp.c b/clients/mapiclient/mhelp.c
--- a/clients/mapiclient/mhelp.c
+++ b/clients/mapiclient/mhelp.c
@@ -68,7 +68,7 @@ SQLhelp sqlhelp1[] = {
        {"ALTER TABLE",
         "",
         "ALTER TABLE [ IF EXISTS ] qname ADD [ COLUMN ] column_def\n"
-        "ALTER TABLE [ IF EXISTS ] qname ADD table_constraint\n"
+        "ALTER TABLE [ IF EXISTS ] qname ADD [ CONSTRAINT ident ] 
table_constraint\n"
         "ALTER TABLE [ IF EXISTS ] qname ALTER [ COLUMN ] ident SET DEFAULT 
value\n"
         "ALTER TABLE [ IF EXISTS ] qname ALTER [ COLUMN ] ident SET [NOT] 
NULL\n"
         "ALTER TABLE [ IF EXISTS ] qname ALTER [ COLUMN ] ident DROP DEFAULT\n"
@@ -910,9 +910,10 @@ SQLhelp sqlhelp2[] = {
         NULL,},
        {"table_constraint",
         NULL,
-        "[ CONSTRAINT ident ] { PRIMARY KEY column_list | UNIQUE column_list 
|\n"
+        "[ CONSTRAINT ident ] { CHECK '(' search_condition ')' |\n"
+        "    PRIMARY KEY column_list | UNIQUE column_list |\n"
         "    FOREIGN KEY column_list REFERENCES qname [ column_list ] [ 
match_options ] [ reference_action ] }",
-        "column_list,match_options,reference_action",
+        "column_list,search_condition,match_options,reference_action",
         "See also 
https://www.monetdb.org/documentation/user-guide/sql-manual/data-definition/table-elements/"},
        {"table_element",
         NULL,
diff --git a/clients/mapilib/mapi.c b/clients/mapilib/mapi.c
--- a/clients/mapilib/mapi.c
+++ b/clients/mapilib/mapi.c
@@ -1217,7 +1217,7 @@ mapi_log_header(Mapi mid, const char *fu
        if (firstcall == 0)
                firstcall = now;
        double seconds = (double)(now - firstcall) / 1e6;
-       mnstr_printf(mid->tracelog, "\342\226\266 [%u] t=%.3fs %s%s %s(), line 
%ld\n", mid->index, seconds, mark1, mark2, funcname, line); /* U+25B6: 
right-pointing triangle */
+       mnstr_printf(mid->tracelog, "\n** [%u] t=%.3fs %s%s %s(), line %ld\n", 
mid->index, seconds, mark1, mark2, funcname, line);
 }
 
 void
diff --git a/gdk/gdk_join.c b/gdk/gdk_join.c
--- a/gdk/gdk_join.c
+++ b/gdk/gdk_join.c
@@ -4212,7 +4212,7 @@ leftjoin(BAT **r1p, BAT **r2p, BAT **r3p
                /* maybe do a hash join on the swapped operands; if we
                 * do, we need to sort the output, so we take that into
                 * account as well */
-               bool lhash, plhash, lcand;
+               bool lhash, plhash, lcand, rkey = r->tkey;
                double lcost;
 
                lcost = joincost(l, rci.ncand, &lci, &lhash, &plhash, &lcand);
@@ -4220,7 +4220,7 @@ leftjoin(BAT **r1p, BAT **r2p, BAT **r3p
                        rc = GDK_FAIL;
                        goto doreturn;
                }
-               if (semi)
+               if (semi && !rkey)
                        lcost += rci.ncand; /* cost of BATunique(r) */
                /* add cost of sorting; obviously we don't know the
                 * size, so we guess that the size of the output is
@@ -4229,7 +4229,7 @@ leftjoin(BAT **r1p, BAT **r2p, BAT **r3p
                if (lcost < rcost) {
                        BAT *tmp = sr;
                        BAT *r1, *r2;
-                       if (semi) {
+                       if (semi && !rkey) {
                                sr = BATunique(r, sr);
                                if (sr == NULL) {
                                        rc = GDK_FAIL;
@@ -4240,7 +4240,7 @@ leftjoin(BAT **r1p, BAT **r2p, BAT **r3p
                        rc = hashjoin(&r2, &r1, NULL, r, l, &rci, &lci, 
nil_matches,
                                      false, false, false, false, false, false, 
estimate,
                                      t0, true, lhash, plhash, lcand, func);
-                       if (semi)
+                       if (semi && !rkey)
                                BBPunfix(sr->batCacheid);
                        if (rc != GDK_SUCCEED)
                                goto doreturn;
diff --git a/gdk/gdk_select.c b/gdk/gdk_select.c
--- a/gdk/gdk_select.c
+++ b/gdk/gdk_select.c
@@ -1986,30 +1986,27 @@ BATselect(BAT *b, BAT *s, const void *tl
                        MT_lock_unset(&pb->batIdxLock);
                }
                if (oidxh) {
-                       /* Is query selective enough to use the ordered index ? 
*/
-                       /* TODO: Test if this heuristic works in practice */
-                       /*if ((ORDERfnd(b, th) - ORDERfnd(b, tl)) < ((BUN)1000 
< bi.count/1000 ? (BUN)1000: bi.count/1000))*/
-                       if ((ORDERfnd(b, oidxh, th) - ORDERfnd(b, oidxh, tl)) < 
bi.count/3) {
-                               if (view) {
-                                       bat_iterator_end(&bi);
-                                       bi = bat_iterator(b);
-                                       poidx = true; /* using parent oidx */
-                                       vwo = (lng) (view->tbaseoff - 
bi.baseoff);
-                                       vwl = b->hseqbase + (oid) vwo + ci.seq 
- view->hseqbase;
-                                       vwh = vwl + canditer_last(&ci) - ci.seq;
-                                       vwo = (lng) view->hseqbase - (lng) 
b->hseqbase - vwo;
-                                       TRC_DEBUG(ALGO, "Switch from " 
ALGOBATFMT " to " ALGOBATFMT " " OIDFMT "-" OIDFMT " hseq " LLFMT "\n", 
ALGOBATPAR(view), ALGOBATPAR(b), vwl, vwh, vwo);
-                               } else {
-                                       vwl = ci.seq;
-                                       vwh = canditer_last(&ci);
-                               }
+                       /* Is query selective enough to use the ordered
+                        * index?  Finding the boundaries is 2*log(n)
+                        * where n is the size of the bat, sorting is
+                        * N*log(N) where N is the number of results.
+                        * If the sum is less than n (cost of scan),
+                        * it's cheaper.  However, to find out how large
+                        * N is, we'd have to do the two boundary
+                        * searches.  If we do that, we might as well do
+                        * it all. */
+                       if (view) {
+                               bat_iterator_end(&bi);
+                               bi = bat_iterator(b);
+                               poidx = true; /* using parent oidx */
+                               vwo = (lng) (view->tbaseoff - bi.baseoff);
+                               vwl = b->hseqbase + (oid) vwo + ci.seq - 
view->hseqbase;
+                               vwh = vwl + canditer_last(&ci) - ci.seq;
+                               vwo = (lng) view->hseqbase - (lng) b->hseqbase 
- vwo;
+                               TRC_DEBUG(ALGO, "Switch from " ALGOBATFMT " to 
" ALGOBATFMT " " OIDFMT "-" OIDFMT " hseq " LLFMT "\n", ALGOBATPAR(view), 
ALGOBATPAR(b), vwl, vwh, vwo);
                        } else {
-                               if (view) {
-                                       b = view;
-                                       view = NULL;
-                               }
-                               HEAPdecref(oidxh, false);
-                               oidxh = NULL;
+                               vwl = ci.seq;
+                               vwh = canditer_last(&ci);
                        }
                }
        }
diff --git a/geom/sql/conformance/Tests/T1.test 
b/geom/sql/conformance/Tests/T1.test
--- a/geom/sql/conformance/Tests/T1.test
+++ b/geom/sql/conformance/Tests/T1.test
@@ -1,4 +1,4 @@
-query T rowsort
+query T nosort
 SELECT f_table_name FROM geometry_columns ORDER BY f_table_name
 ----
 bridges
diff --git a/sql/ChangeLog b/sql/ChangeLog
--- a/sql/ChangeLog
+++ b/sql/ChangeLog
@@ -1,3 +1,7 @@
 # ChangeLog file for sql
 # This file is updated with Maddlog
 
+* Tue Sep 10 2024 Lucas Pereira <lucas.pere...@monetdbsolutions.com>
+- Introduce division_min_scale SQL environment variable for specifying
+  minimum scale of the division result. The default value is 3.
+
diff --git a/sql/backends/monet5/Tests/rapi05.test 
b/sql/backends/monet5/Tests/rapi05.test
--- a/sql/backends/monet5/Tests/rapi05.test
+++ b/sql/backends/monet5/Tests/rapi05.test
@@ -11,7 +11,7 @@ statement ok
 CREATE FUNCTION kmeans(data float, ncluster integer) returns integer
 language R {kmeans(data,ncluster)$cluster}
 
-query I rowsort
+query I nosort
 SELECT cluster FROM (SELECT MIN(x) AS minx, MAX(x) AS maxx, kmeans(x,5) AS 
cluster FROM xdata
        GROUP BY cluster) as cdata ORDER BY cluster
 ----
diff --git a/sql/backends/monet5/generator/Tests/joins00.test 
b/sql/backends/monet5/generator/Tests/joins00.test
--- a/sql/backends/monet5/generator/Tests/joins00.test
+++ b/sql/backends/monet5/generator/Tests/joins00.test
@@ -98,14 +98,14 @@ create table tmp(i tinyint)
 statement ok
 insert into tmp values(3),(4),(5)
 
-query I rowsort
+query I nosort
 select * from tmp order by i
 ----
 3
 4
 5
 
-query II rowsort
+query II nosort
 select * from generate_series(9,0,-2) X, tmp Y where X.value = Y.i order by 
X.value, Y.i
 ----
 3
@@ -113,7 +113,7 @@ 3
 5
 5
 
-query II rowsort
+query II nosort
 select * from generate_series(9,0,-2) X, tmp Y where Y.i = X.value order by 
X.value, Y.i
 ----
 3
@@ -121,13 +121,13 @@ 3
 5
 5
 
-query II rowsort
+query II nosort
 select * from generate_series(9,0,-2) X, tmp Y where X.value = Y.i and value 
<5 order by X.value, Y.i
 ----
 3
 3
 
-query II rowsort
+query II nosort
 select * from generate_series(9,0,-2) as  X, tmp Y where X.value = Y.i and 
value <7 and value >3 order by X.value, Y.i
 ----
 5
diff --git a/sql/backends/monet5/generator/Tests/joins01.test 
b/sql/backends/monet5/generator/Tests/joins01.test
--- a/sql/backends/monet5/generator/Tests/joins01.test
+++ b/sql/backends/monet5/generator/Tests/joins01.test
@@ -7,14 +7,14 @@ insert into tmp values
 (timestamp '2008-03-01 10:00'),
 (timestamp '2008-03-01 20:00')
 
-query T rowsort
+query T nosort
 select * from tmp order by i
 ----
 2008-03-01 00:00:00
 2008-03-01 10:00:00
 2008-03-01 20:00:00
 
-query TT rowsort
+query TT nosort
 select * from generate_series(timestamp '2008-03-01 00:00',timestamp 
'2008-03-04 12:00',cast( '10' as interval hour)) X, tmp Y where X.value = Y.i 
order by X.value, Y.i
 ----
 2008-03-01 00:00:00
@@ -24,7 +24,7 @@ 2008-03-01 10:00:00
 2008-03-01 20:00:00
 2008-03-01 20:00:00
 
-query TT rowsort
+query TT nosort
 select * from generate_series(timestamp '2008-03-01 00:00',timestamp 
'2008-03-04 12:00',cast( '10' as interval hour)) X, tmp Y where Y.i = X.value 
order by X.value, Y.i
 ----
 2008-03-01 00:00:00
@@ -34,7 +34,7 @@ 2008-03-01 10:00:00
 2008-03-01 20:00:00
 2008-03-01 20:00:00
 
-query TT rowsort
+query TT nosort
 select * from generate_series(timestamp '2008-03-01 00:00',timestamp 
'2008-03-04 12:00',cast( '10' as interval hour)) X, tmp Y where X.value = Y.i 
and value < timestamp '2008-03-01 20:00' order by X.value, Y.i
 ----
 2008-03-01 00:00:00
@@ -42,7 +42,7 @@ 2008-03-01 00:00:00
 2008-03-01 10:00:00
 2008-03-01 10:00:00
 
-query TT rowsort
+query TT nosort
 select * from generate_series(timestamp '2008-03-01 00:00',timestamp 
'2008-03-04 12:00',cast( '10' as interval hour)) X, tmp Y where Y.i = X.value  
and value < timestamp '2008-03-01 20:00' order by X.value, Y.i
 ----
 2008-03-01 00:00:00
@@ -50,7 +50,7 @@ 2008-03-01 00:00:00
 2008-03-01 10:00:00
 2008-03-01 10:00:00
 
-query TT rowsort
+query TT nosort
 select * from generate_series(timestamp '2008-03-01 00:00',timestamp 
'2008-03-04 12:00',cast( '10' as interval hour)) as  X, tmp Y where X.value = 
Y.i and value < timestamp '2008-03-01 20:00' and value > timestamp '200-03-01 
00:00' order by X.value, Y.i
 ----
 2008-03-01 00:00:00
@@ -58,7 +58,7 @@ 2008-03-01 00:00:00
 2008-03-01 10:00:00
 2008-03-01 10:00:00
 
-query TT rowsort
+query TT nosort
 select * from generate_series(timestamp '2008-03-01 00:00',timestamp 
'2008-03-04 12:00',cast( '10' as interval hour)) as  X, tmp Y where X.value = 
Y.i and i < timestamp '2008-03-01 20:00' and i > timestamp '200-03-01 00:00' 
order by X.value, Y.i
 ----
 2008-03-01 00:00:00
@@ -66,7 +66,7 @@ 2008-03-01 00:00:00
 2008-03-01 10:00:00
 2008-03-01 10:00:00
 
-query T rowsort
+query T nosort
 select * from generate_series(timestamp '2008-03-04 18:00',timestamp 
'2008-03-01 00:00',cast( '-10' as interval hour)) X order by X.value
 ----
 2008-03-01 10:00:00
@@ -79,7 +79,7 @@ 2008-03-03 22:00:00
 2008-03-04 08:00:00
 2008-03-04 18:00:00
 
-query TT rowsort
+query TT nosort
 select * from generate_series(timestamp '2008-03-04 18:00',timestamp 
'2008-03-01 00:00',cast( '-10' as interval hour)) X, tmp Y where X.value = Y.i 
order by X.value, Y.i
 ----
 2008-03-01 10:00:00
@@ -87,7 +87,7 @@ 2008-03-01 10:00:00
 2008-03-01 20:00:00
 2008-03-01 20:00:00
 
-query TT rowsort
+query TT nosort
 select * from generate_series(timestamp '2008-03-04 18:00',timestamp 
'2008-03-01 00:00',cast( '-10' as interval hour)) X, tmp Y where Y.i = X.value 
order by X.value, Y.i
 ----
 2008-03-01 10:00:00
@@ -95,26 +95,26 @@ 2008-03-01 10:00:00
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to