Changeset: 2e1bfee1461d for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2e1bfee1461d Modified Files: gdk/ChangeLog.Jul2017 gdk/gdk_batop.c gdk/gdk_logger.c sql/backends/monet5/sql_cat.c sql/benchmarks/tpch/fileleak/Tests/delete_all.stable.out sql/benchmarks/tpch/fileleak/Tests/leaks.stable.out sql/benchmarks/tpch/fileleak/Tests/leaks.stable.out.Windows sql/server/rel_select.c sql/server/sql_parser.y sql/test/BugTracker-2011/Tests/UDF_in_schema.Bug-2817.sql sql/test/BugTracker-2012/Tests/insert_serial_with_unique_key.Bug-3091.sql sql/test/BugTracker-2015/Tests/schema_view.Bug-3708.sql sql/test/BugTracker-2017/Tests/function_and_mergetable.Bug-6288.sql sql/test/Dependencies/Tests/Dependencies.stable.out sql/test/Dependencies/Tests/Dependencies.stable.out.int128 sql/test/Skyserver/drop_user.sql sql/test/leaks/Tests/check1.stable.out.int128 Branch: default Log Message:
Merge with Jul2017 branch. diffs (truncated from 453 to 300 lines): diff --git a/gdk/ChangeLog.Jul2017 b/gdk/ChangeLog.Jul2017 --- a/gdk/ChangeLog.Jul2017 +++ b/gdk/ChangeLog.Jul2017 @@ -1,3 +1,7 @@ # ChangeLog file for MonetDB # This file is updated with Maddlog +* Mon Oct 23 2017 Sjoerd Mullender <sjo...@acm.org> +- A serious bug, possibly resulting in database corruption, having to + do with appending data to a string BAT was fixed. + diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c --- a/gdk/gdk_batop.c +++ b/gdk/gdk_batop.c @@ -174,8 +174,12 @@ insert_string_bat(BAT *b, BAT *n, BAT *s } memcpy(b->tvheap->base + toff, n->tvheap->base, n->tvheap->free); b->tvheap->free = toff + n->tvheap->free; - /* flush double-elimination hash table */ - memset(b->tvheap->base, 0, GDK_STRHASHSIZE); + if (toff > 0) { + /* flush double-elimination + * hash table */ + memset(b->tvheap->base, 0, + GDK_STRHASHSIZE); + } } } if (toff != ~(size_t) 0) { @@ -195,38 +199,10 @@ insert_string_bat(BAT *b, BAT *n, BAT *s goto bunins_failed; } } - switch (b->twidth) { - case 1: - b->ttype = TYPE_bte; - tp = &tbv; - break; - case 2: - b->ttype = TYPE_sht; - tp = &tsv; - break; -#if SIZEOF_VAR_T == 8 - case 4: - b->ttype = TYPE_int; - tp = &tiv; - break; - case 8: - b->ttype = TYPE_lng; - tp = &v; - break; -#else - case 4: - b->ttype = TYPE_int; - tp = &v; - break; -#endif - default: - assert(0); - } - b->tvarsized = 0; } } else if (unshare_string_heap(b) != GDK_SUCCEED) return GDK_FAIL; - if (toff == 0 && n->twidth == b->twidth) { + if (toff == 0 && n->twidth == b->twidth && cand == NULL) { /* we don't need to do any translation of offset * values, so we can use fast memcpy */ memcpy(Tloc(b, BUNlast(b)), Tloc(n, start), @@ -250,6 +226,34 @@ insert_string_bat(BAT *b, BAT *n, BAT *s #endif const var_t *restrict tvp = (const var_t *) Tloc(n, 0); + switch (b->twidth) { + case 1: + b->ttype = TYPE_bte; + tp = &tbv; + break; + case 2: + b->ttype = TYPE_sht; + tp = &tsv; + break; +#if SIZEOF_VAR_T == 8 + case 4: + b->ttype = TYPE_int; + tp = &tiv; + break; + case 8: + b->ttype = TYPE_lng; + tp = &v; + break; +#else + case 4: + b->ttype = TYPE_int; + tp = &v; + break; +#endif + default: + assert(0); + } + b->tvarsized = 0; for (;;) { if (cand) { if (cand == candend) @@ -299,6 +303,8 @@ insert_string_bat(BAT *b, BAT *n, BAT *s } bunfastapp(b, tp); } + b->tvarsized = 1; + b->ttype = TYPE_str; } else if (b->tvheap->free < n->tvheap->free / 2 || GDK_ELIMDOUBLES(b->tvheap)) { /* if b's string heap is much smaller than n's string @@ -394,8 +400,6 @@ insert_string_bat(BAT *b, BAT *n, BAT *s r++; } } - b->tvarsized = 1; - b->ttype = TYPE_str; return GDK_SUCCEED; bunins_failed: b->tvarsized = 1; @@ -531,24 +535,27 @@ BATappend(BAT *b, BAT *n, BAT *s, bit fo r = BUNlast(b); - if (BATcount(b) == 0 && cand == NULL) { + if (BATcount(b) == 0) { BATiter ni = bat_iterator(n); b->tsorted = n->tsorted; - b->tnosorted = start <= n->tnosorted && n->tnosorted < end ? n->tnosorted - start : 0; b->trevsorted = n->trevsorted; - b->tnorevsorted = start <= n->tnorevsorted && n->tnorevsorted < end ? n->tnorevsorted - start : 0; b->tdense = n->tdense && cand == NULL; - b->tnodense = start <= n->tnodense && n->tnodense < end ? n->tnodense - start : 0; b->tnonil = n->tnonil; b->tnil = n->tnil && cnt == BATcount(n); b->tseqbase = oid_nil; if (cand == NULL) { + b->tnosorted = start <= n->tnosorted && n->tnosorted < end ? n->tnosorted - start : 0; + b->tnorevsorted = start <= n->tnorevsorted && n->tnorevsorted < end ? n->tnorevsorted - start : 0; + b->tnodense = start <= n->tnodense && n->tnodense < end ? n->tnodense - start : 0; if (n->tdense && n->ttype == TYPE_oid) b->tseqbase = *(oid *) BUNtail(ni, start); else if (n->ttype == TYPE_void && n->tseqbase != oid_nil) b->tseqbase = n->tseqbase + start; + } else { + b->tnosorted = 0; + b->tnorevsorted = 0; } /* if tunique, uniqueness is guaranteed above */ b->tkey = n->tkey | b->tunique; @@ -559,7 +566,7 @@ BATappend(BAT *b, BAT *n, BAT *s, bit fo b->tnokey[0] = b->tnokey[1] = 0; } } else { - BUN last = BUNlast(b) - 1; + BUN last = r - 1; BATiter ni = bat_iterator(n); BATiter bi = bat_iterator(b); int xx = ATOMcmp(b->ttype, BUNtail(ni, start), BUNtail(bi, last)); diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c --- a/gdk/gdk_logger.c +++ b/gdk/gdk_logger.c @@ -1314,6 +1314,7 @@ bm_subcommit(logger *lg, BAT *list_bid, } bids = logbat_new(TYPE_int, BATcount(tids), PERSISTENT); nmes = logbat_new(TYPE_str, BATcount(tids), PERSISTENT); + if (bids == NULL || nmes == NULL) { logbat_destroy(tids); logbat_destroy(bids); @@ -1321,6 +1322,7 @@ bm_subcommit(logger *lg, BAT *list_bid, GDKfree(n); return GDK_FAIL; } + if (BATappend(bids, catalog_bid, tids, TRUE) != GDK_SUCCEED || BATappend(nmes, catalog_nme, tids, TRUE) != GDK_SUCCEED) { logbat_destroy(tids); diff --git a/sql/backends/monet5/sql_cat.c b/sql/backends/monet5/sql_cat.c --- a/sql/backends/monet5/sql_cat.c +++ b/sql/backends/monet5/sql_cat.c @@ -874,7 +874,11 @@ SQLdrop_schema(Client cntxt, MalBlkPtr m } else if (s->system) { throw(SQL,"sql.drop_schema",SQLSTATE(42000) "DROP SCHEMA: access denied for '%s'", sname); } else if (sql_schema_has_user(sql, s)) { - throw(SQL,"sql.drop_schema",SQLSTATE(2BM37) "DROP SCHEMA: unable to drop schema '%s' (there are database objects which depend on it", sname); + throw(SQL,"sql.drop_schema",SQLSTATE(2BM37) "DROP SCHEMA: unable to drop schema '%s' (there are database objects which depend on it)", sname); + } else if (!action /* RESTRICT */ && ( + !list_empty(s->tables.set) || !list_empty(s->types.set) || + !list_empty(s->funcs.set) || !list_empty(s->seqs.set))) { + throw(SQL,"sql.drop_schema",SQLSTATE(2BM37) "DROP SCHEMA: unable to drop schema '%s' (there are database objects which depend on it)", sname); } else { mvc_drop_schema(sql, s, action); } diff --git a/sql/benchmarks/tpch/fileleak/Tests/delete_all.stable.out b/sql/benchmarks/tpch/fileleak/Tests/delete_all.stable.out --- a/sql/benchmarks/tpch/fileleak/Tests/delete_all.stable.out +++ b/sql/benchmarks/tpch/fileleak/Tests/delete_all.stable.out @@ -42,22 +42,22 @@ Ready. (u'l_suppkey', 262144, 60175) (u'l_tax', 524288, 60175) [(u'l_comment', 0), (u'l_commitdate', 0), (u'l_discount', 0), (u'l_extendedprice', 0), (u'l_linenumber', 0), (u'l_linestatus', 0), (u'l_orderkey', 0), (u'l_partkey', 0), (u'l_quantity', 0), (u'l_receiptdate', 0), (u'l_returnflag', 0), (u'l_shipdate', 0), (u'l_shipinstruct', 0), (u'l_shipmode', 0), (u'l_suppkey', 0), (u'l_tax', 0)] -(u'l_comment', 65536, 0) -(u'l_commitdate', 65536, 0) -(u'l_discount', 65536, 0) -(u'l_extendedprice', 65536, 0) -(u'l_linenumber', 65536, 0) -(u'l_linestatus', 0, 0) -(u'l_orderkey', 65536, 0) -(u'l_partkey', 65536, 0) -(u'l_quantity', 65536, 0) -(u'l_receiptdate', 65536, 0) -(u'l_returnflag', 0, 0) -(u'l_shipdate', 65536, 0) -(u'l_shipinstruct', 0, 0) -(u'l_shipmode', 0, 0) -(u'l_suppkey', 65536, 0) -(u'l_tax', 65536, 0) +(u'l_comment', 262144, 0) +(u'l_commitdate', 262144, 0) +(u'l_discount', 524288, 0) +(u'l_extendedprice', 524288, 0) +(u'l_linenumber', 262144, 0) +(u'l_linestatus', 65536, 0) +(u'l_orderkey', 262144, 0) +(u'l_partkey', 262144, 0) +(u'l_quantity', 524288, 0) +(u'l_receiptdate', 262144, 0) +(u'l_returnflag', 65536, 0) +(u'l_shipdate', 262144, 0) +(u'l_shipinstruct', 65536, 0) +(u'l_shipmode', 65536, 0) +(u'l_suppkey', 262144, 0) +(u'l_tax', 524288, 0) # 13:16:20 > # 13:16:20 > "Done." diff --git a/sql/benchmarks/tpch/fileleak/Tests/leaks.stable.out b/sql/benchmarks/tpch/fileleak/Tests/leaks.stable.out --- a/sql/benchmarks/tpch/fileleak/Tests/leaks.stable.out +++ b/sql/benchmarks/tpch/fileleak/Tests/leaks.stable.out @@ -25,22 +25,22 @@ Ready. # 16:01:26 > "/usr/bin/python2" "leaks.SQL.py" "leaks" # 16:01:26 > -(u'l_comment', 65536, 0) -(u'l_commitdate', 65536, 0) -(u'l_discount', 65536, 0) -(u'l_extendedprice', 65536, 0) -(u'l_linenumber', 65536, 0) +(u'l_comment', 262144, 0) +(u'l_commitdate', 262144, 0) +(u'l_discount', 524288, 0) +(u'l_extendedprice', 524288, 0) +(u'l_linenumber', 262144, 0) (u'l_linestatus', 0, 0) -(u'l_orderkey', 65536, 0) -(u'l_partkey', 65536, 0) -(u'l_quantity', 65536, 0) -(u'l_receiptdate', 65536, 0) +(u'l_orderkey', 262144, 0) +(u'l_partkey', 262144, 0) +(u'l_quantity', 524288, 0) +(u'l_receiptdate', 262144, 0) (u'l_returnflag', 0, 0) -(u'l_shipdate', 65536, 0) +(u'l_shipdate', 262144, 0) (u'l_shipinstruct', 0, 0) (u'l_shipmode', 0, 0) -(u'l_suppkey', 65536, 0) -(u'l_tax', 65536, 0) +(u'l_suppkey', 262144, 0) +(u'l_tax', 524288, 0) # 16:01:26 > # 16:01:26 > "Done." diff --git a/sql/benchmarks/tpch/fileleak/Tests/leaks.stable.out.Windows b/sql/benchmarks/tpch/fileleak/Tests/leaks.stable.out.Windows --- a/sql/benchmarks/tpch/fileleak/Tests/leaks.stable.out.Windows +++ b/sql/benchmarks/tpch/fileleak/Tests/leaks.stable.out.Windows @@ -25,22 +25,22 @@ Ready. # 16:01:26 > "/usr/bin/python2" "leaks.SQL.py" "leaks" # 16:01:26 > -(u'l_comment', 65536, 0) -(u'l_commitdate', 65536, 0) -(u'l_discount', 65536, 0) -(u'l_extendedprice', 65536, 0) -(u'l_linenumber', 65536, 0) +(u'l_comment', 262144, 0) +(u'l_commitdate', 262144, 0) +(u'l_discount', 524288, 0) +(u'l_extendedprice', 524288, 0) +(u'l_linenumber', 262144, 0) (u'l_linestatus', 0, 0) -(u'l_orderkey', 65536, 0) -(u'l_partkey', 65536, 0) -(u'l_quantity', 65536, 0) -(u'l_receiptdate', 65536, 0) _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list