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