Changeset: 933363b389f7 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=933363b389f7
Added Files:
sql/test/BugTracker-2017/Tests/all_dates.csv.gz
sql/test/BugTracker-2017/Tests/empty-interval.Bug-6184.sql
sql/test/BugTracker-2017/Tests/empty-interval.Bug-6184.stable.err
sql/test/BugTracker-2017/Tests/empty-interval.Bug-6184.stable.out
sql/test/BugTracker-2017/Tests/heapextend.Bug-6134.sql.in
Modified Files:
gdk/gdk_cross.c
gdk/gdk_select.c
sql/backends/monet5/sql_gencode.c
sql/backends/monet5/sql_statement.c
sql/storage/bat/bat_table.c
sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out
sql/test/BugTracker-2015/Tests/useless_casts.Bug-3756.stable.out
sql/test/BugTracker-2016/Tests/decimal_vs_integer.Bug-3941.stable.out
sql/test/BugTracker-2017/Tests/All
Branch: default
Log Message:
Merge with Dec2016 branch.
diffs (truncated from 2363 to 300 lines):
diff --git a/gdk/gdk_cross.c b/gdk/gdk_cross.c
--- a/gdk/gdk_cross.c
+++ b/gdk/gdk_cross.c
@@ -9,49 +9,7 @@
#include "monetdb_config.h"
#include "gdk.h"
#include "gdk_private.h"
-
-static gdk_return
-BATcross1(BAT **r1p, BAT **r2p, BAT *l, BAT *r)
-{
- BAT *bn1, *bn2;
- BUN i, j;
- oid *restrict p1, *restrict p2;
-
- bn1 = COLnew(0, TYPE_oid, BATcount(l) * BATcount(r), TRANSIENT);
- bn2 = COLnew(0, TYPE_oid, BATcount(l) * BATcount(r), TRANSIENT);
- if (bn1 == NULL || bn2 == NULL) {
- BBPreclaim(bn1);
- BBPreclaim(bn2);
- return GDK_FAIL;
- }
- p1 = (oid *) Tloc(bn1, 0);
- p2 = (oid *) Tloc(bn2, 0);
- for (i = 0; i < BATcount(l); i++) {
- for (j = 0; j < BATcount(r); j++) {
- *p1++ = i + l->hseqbase;
- *p2++ = j + r->hseqbase;
- }
- }
- BATsetcount(bn1, BATcount(l) * BATcount(r));
- BATsetcount(bn2, BATcount(l) * BATcount(r));
- bn1->tsorted = 1;
- bn1->trevsorted = BATcount(l) <= 1;
- bn1->tkey = BATcount(r) <= 1;
- bn1->tdense = bn1->tkey != 0;
- bn1->tnil = 0;
- bn1->tnonil = 1;
- bn2->tsorted = BATcount(l) <= 1;
- bn2->trevsorted = BATcount(bn2) <= 1;
- bn2->tkey = BATcount(l) <= 1;
- bn2->tdense = bn2->tkey != 0;
- bn2->tnil = 0;
- bn2->tnonil = 1;
- BATtseqbase(bn1, l->hseqbase);
- BATtseqbase(bn2, r->hseqbase);
- *r1p = bn1;
- *r2p = bn2;
- return GDK_SUCCEED;
-}
+#include "gdk_cand.h"
/* Calculate a cross product between bats l and r with optional
* candidate lists sl for l and sr for r.
@@ -60,28 +18,75 @@ BATcross1(BAT **r1p, BAT **r2p, BAT *l,
gdk_return
BATsubcross(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT *sl, BAT *sr)
{
- BAT *bn1, *bn2, *t;
+ BAT *bn1, *bn2;
+ BUN start1, start2;
+ BUN end1, end2;
+ BUN cnt1, cnt2;
+ const oid *restrict lcand, *restrict rcand;
+ const oid *lcandend, *rcandend;
+ oid seq;
+ oid *restrict p;
+ BUN i, j;
- if (BATcross1(&bn1, &bn2, sl ? sl : l, sr ? sr : r) != GDK_SUCCEED)
+ CANDINIT(l, sl, start1, end1, cnt1, lcand, lcandend);
+ CANDINIT(r, sr, start2, end2, cnt2, rcand, rcandend);
+ if (lcand)
+ cnt1 = lcandend - lcand;
+ if (rcand)
+ cnt2 = rcandend - rcand;
+
+ bn1 = COLnew(0, TYPE_oid, cnt1 * cnt2, TRANSIENT);
+ if (bn1 == NULL)
return GDK_FAIL;
- if (sl) {
- t = BATproject(bn1, sl);
- BBPunfix(bn1->batCacheid);
- if (t == NULL) {
- BBPunfix(bn2->batCacheid);
- return GDK_FAIL;
- }
- bn1 = t;
+ BATsetcount(bn1, cnt1 * cnt2);
+ bn1->tsorted = 1;
+ bn1->trevsorted = cnt1 <= 1;
+ bn1->tkey = cnt2 <= 1;
+ bn1->tnil = 0;
+ bn1->tnonil = 1;
+ p = (oid *) Tloc(bn1, 0);
+ if (lcand) {
+ for (i = 0; i < cnt1; i++)
+ for (j = 0; j < cnt2; j++)
+ *p++ = lcand[i];
+ bn1->tdense = 0;
+ } else {
+ seq = l->hseqbase + start1;
+ for (i = 0; i < cnt1; i++)
+ for (j = 0; j < cnt2; j++)
+ *p++ = i + seq;
+ bn1->tdense = bn1->tkey != 0;
+ if (bn1->tdense)
+ BATtseqbase(bn1, seq);
}
- if (sr) {
- t = BATproject(bn2, sr);
- BBPunfix(bn2->batCacheid);
- if (t == NULL) {
- BBPunfix(bn1->batCacheid);
- return GDK_FAIL;
- }
- bn2 = t;
+
+ bn2 = COLnew(0, TYPE_oid, cnt1 * cnt2, TRANSIENT);
+ if (bn2 == NULL) {
+ BBPreclaim(bn1);
+ return GDK_FAIL;
}
+ BATsetcount(bn2, cnt1 * cnt2);
+ bn2->tsorted = cnt1 <= 1;
+ bn2->trevsorted = cnt2 <= 1;
+ bn2->tkey = cnt1 <= 1;
+ bn2->tnil = 0;
+ bn2->tnonil = 1;
+ p = (oid *) Tloc(bn2, 0);
+ if (rcand) {
+ for (i = 0; i < cnt1; i++)
+ for (j = 0; j < cnt2; j++)
+ *p++ = rcand[j];
+ bn2->tdense = 0;
+ } else {
+ seq = r->hseqbase + start2;
+ for (i = 0; i < cnt1; i++)
+ for (j = 0; j < cnt2; j++)
+ *p++ = j + seq;
+ bn2->tdense = bn2->tkey != 0;
+ if (bn2->tdense)
+ BATtseqbase(bn2, seq);
+ }
+
*r1p = bn1;
*r2p = bn2;
return GDK_SUCCEED;
diff --git a/gdk/gdk_select.c b/gdk/gdk_select.c
--- a/gdk/gdk_select.c
+++ b/gdk/gdk_select.c
@@ -1257,6 +1257,20 @@ BATselect(BAT *b, BAT *s, const void *tl
/* can we use the base type? */
t = ATOMbasetype(t);
lnil = ATOMcmp(t, tl, nil) == 0; /* low value = nil? */
+
+ if (!lnil && th != NULL && (!li || !hi) && !anti && ATOMcmp(t, tl, th)
== 0) {
+ /* upper and lower bound of range are equal and we
+ * want an interval that's open on at least one
+ * side */
+ ALGODEBUG fprintf(stderr, "#BATselect(b=%s#" BUNFMT
+ ",s=%s%s,li=%d,hi=%d,anti=%d): empty
interval\n",
+ BATgetId(b), BATcount(b),
+ s ? BATgetId(s) : "NULL",
+ s && BATtdense(s) ? "(dense)" : "",
+ li, hi, anti);
+ return newempty();
+ }
+
lval = !lnil || th == NULL; /* low value used for comparison */
equi = th == NULL || (lval && ATOMcmp(t, tl, th) == 0); /* point
select? */
if (equi) {
diff --git a/sql/backends/monet5/sql_statement.c
b/sql/backends/monet5/sql_statement.c
--- a/sql/backends/monet5/sql_statement.c
+++ b/sql/backends/monet5/sql_statement.c
@@ -1279,7 +1279,7 @@ stmt_uselect(backend *be, stmt *op1, stm
q = pushArgument(mb, q, r);
q = pushArgument(mb, q, r);
q = pushBit(mb, q, TRUE);
- q = pushBit(mb, q, FALSE);
+ q = pushBit(mb, q, TRUE);
q = pushBit(mb, q, FALSE);
if (q == NULL)
return NULL;
diff --git a/sql/storage/bat/bat_table.c b/sql/storage/bat/bat_table.c
--- a/sql/storage/bat/bat_table.c
+++ b/sql/storage/bat/bat_table.c
@@ -261,7 +261,8 @@ rids_select( sql_trans *tr, sql_column *
BAT *b = NULL, *r = NULL, *s = NULL;
rids *rs = ZNEW(rids);
const void *kvl = key_value_low, *kvh = key_value_high;
- int hi = 0;
+ /* if pointers are equal, make it an inclusive select */
+ int hi = key_value_low == key_value_high;
s = delta_cands(tr, key->t);
b = full_column(tr, key);
diff --git
a/sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out
b/sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out
---
a/sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out
+++
b/sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out
@@ -296,38 +296,38 @@ end user.s10_1;
% clob # type
% 142 # length
function user.s20_1():void;
- X_90:void := querylog.define("-- no query", "sequential_pipe", 12:int);
- X_38 := bat.new(nil:str);
- X_45 := bat.append(X_38, "sys.functions");
- X_55 := bat.append(X_45, "sys.functions");
+ X_89:void := querylog.define("-- no query", "sequential_pipe", 12:int);
+ X_37 := bat.new(nil:str);
+ X_44 := bat.append(X_37, "sys.functions");
+ X_54 := bat.append(X_44, "sys.functions");
+ X_39 := bat.new(nil:str);
+ X_46 := bat.append(X_39, "name");
+ X_55 := bat.append(X_46, "func");
X_40 := bat.new(nil:str);
- X_47 := bat.append(X_40, "name");
- X_56 := bat.append(X_47, "func");
- X_41 := bat.new(nil:str);
- X_49 := bat.append(X_41, "varchar");
- X_58 := bat.append(X_49, "varchar");
- X_42 := bat.new(nil:int);
- X_51 := bat.append(X_42, 256:int);
- X_59 := bat.append(X_51, 8196:int);
- X_44 := bat.new(nil:int);
- X_53 := bat.append(X_44, 0:int);
- X_61 := bat.append(X_53, 0:int);
+ X_48 := bat.append(X_40, "varchar");
+ X_57 := bat.append(X_48, "varchar");
+ X_41 := bat.new(nil:int);
+ X_50 := bat.append(X_41, 256:int);
+ X_58 := bat.append(X_50, 8196:int);
+ X_43 := bat.new(nil:int);
+ X_52 := bat.append(X_43, 0:int);
+ X_60 := bat.append(X_52, 0:int);
X_5 := sql.mvc();
C_6:bat[:oid] := sql.tid(X_5, "sys", "functions");
X_9:bat[:str] := sql.bind(X_5, "sys", "functions", "name", 0:int);
(C_14:bat[:oid], X_15:bat[:str]) := sql.bind(X_5, "sys", "functions",
"name", 2:int);
X_12:bat[:str] := sql.bind(X_5, "sys", "functions", "name", 1:int);
X_18 := sql.projectdelta(C_6, X_9, C_14, X_15, X_12);
- X_101:bat[:bit] := batalgebra.like(X_18, "%optimizers%":str);
- C_32 := algebra.select(X_101, true, true, true, false, false);
- X_35 := algebra.projection(C_32, X_18);
+ X_100:bat[:bit] := batalgebra.like(X_18, "%optimizers%":str);
+ C_32 := algebra.select(X_100, true, true, true, true, false);
+ X_34 := algebra.projection(C_32, X_18);
X_19:bat[:str] := sql.bind(X_5, "sys", "functions", "func", 0:int);
(C_22:bat[:oid], X_23:bat[:str]) := sql.bind(X_5, "sys", "functions",
"func", 2:int);
X_21:bat[:str] := sql.bind(X_5, "sys", "functions", "func", 1:int);
X_25 := sql.projectdelta(C_6, X_19, C_22, X_23, X_21);
- X_36 := algebra.projection(C_32, X_25);
+ X_35 := algebra.projection(C_32, X_25);
X_2:void := querylog.define("explain select name,func from functions where
contains(name, \\'optimizers\\');", "sequential_pipe", 37:int);
- sql.resultSet(X_55, X_56, X_58, X_59, X_61, X_35, X_36);
+ sql.resultSet(X_54, X_55, X_57, X_58, X_60, X_34, X_35);
end user.s20_1;
#inline actions= 0 time=12 usec
#remap actions= 1 time=100 usec
@@ -358,38 +358,38 @@ end user.s20_1;
% clob # type
% 146 # length
function user.s22_1():void;
- X_90:void := querylog.define("-- no query", "sequential_pipe", 12:int);
- X_38 := bat.new(nil:str);
- X_45 := bat.append(X_38, "sys.functions");
- X_55 := bat.append(X_45, "sys.functions");
+ X_89:void := querylog.define("-- no query", "sequential_pipe", 12:int);
+ X_37 := bat.new(nil:str);
+ X_44 := bat.append(X_37, "sys.functions");
+ X_54 := bat.append(X_44, "sys.functions");
+ X_39 := bat.new(nil:str);
+ X_46 := bat.append(X_39, "name");
+ X_55 := bat.append(X_46, "func");
X_40 := bat.new(nil:str);
- X_47 := bat.append(X_40, "name");
- X_56 := bat.append(X_47, "func");
- X_41 := bat.new(nil:str);
- X_49 := bat.append(X_41, "varchar");
- X_58 := bat.append(X_49, "varchar");
- X_42 := bat.new(nil:int);
- X_51 := bat.append(X_42, 256:int);
- X_59 := bat.append(X_51, 8196:int);
- X_44 := bat.new(nil:int);
- X_53 := bat.append(X_44, 0:int);
- X_61 := bat.append(X_53, 0:int);
+ X_48 := bat.append(X_40, "varchar");
+ X_57 := bat.append(X_48, "varchar");
+ X_41 := bat.new(nil:int);
+ X_50 := bat.append(X_41, 256:int);
+ X_58 := bat.append(X_50, 8196:int);
+ X_43 := bat.new(nil:int);
+ X_52 := bat.append(X_43, 0:int);
+ X_60 := bat.append(X_52, 0:int);
X_5 := sql.mvc();
C_6:bat[:oid] := sql.tid(X_5, "sys", "functions");
X_9:bat[:str] := sql.bind(X_5, "sys", "functions", "name", 0:int);
(C_14:bat[:oid], X_15:bat[:str]) := sql.bind(X_5, "sys", "functions",
"name", 2:int);
X_12:bat[:str] := sql.bind(X_5, "sys", "functions", "name", 1:int);
X_18 := sql.projectdelta(C_6, X_9, C_14, X_15, X_12);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list