Changeset: 54be80b70b50 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/54be80b70b50
Branch: monetdburl
Log Message:

merged with default


diffs (truncated from 2240 to 300 lines):

diff --git a/documentation/index.rst b/documentation/index.rst
--- a/documentation/index.rst
+++ b/documentation/index.rst
@@ -31,6 +31,7 @@ Welcome to MonetDB's documentation!
    source/cmake
    source/release
    source/developers_handbook
+   source/binary-resultset
 
 Indices and tables
 ==================
diff --git a/gdk/gdk_join.c b/gdk/gdk_join.c
--- a/gdk/gdk_join.c
+++ b/gdk/gdk_join.c
@@ -2279,21 +2279,27 @@ mergejoin(BAT **r1p, BAT **r2p, BAT **r3
                                        }
                                        if (maybeextend(r1, r2, r3, nlx, 
lci->next, lci->ncand, maxsize) != GDK_SUCCEED)
                                                goto bailout;
+                                       if (r3)
+                                               r3->tnil = false;
                                        while (nlx > 0) {
                                                lv = canditer_next(lci);
                                                if (mlci == NULL || 
canditer_contains(mlci, lv)) {
                                                        APPEND(r1, lv);
                                                        if (r2)
                                                                APPEND(r2, 
oid_nil);
-                                                       if (r3)
-                                                               ((bit *) 
r3->theap->base)[r3->batCount++] = defmark;
+                                                       if (r3) {
+                                                               if (rhasnil || 
cmp(VALUE(l, lv - l->hseqbase), nil) == 0) {
+                                                                       ((bit 
*) r3->theap->base)[r3->batCount++] = bit_nil;
+                                                                       
r3->tnil = true;
+                                                               } else {
+                                                                       ((bit 
*) r3->theap->base)[r3->batCount++] = 0;
+                                                               }
+                                                       }
                                                }
                                                nlx--;
                                        }
                                        if (r1->trevsorted && BATcount(r1) > 1)
                                                r1->trevsorted = false;
-                                       if (r3)
-                                               r3->tnil = rhasnil;
                                } else {
                                        canditer_setidx(lci, lci->next + nlx);
                                }
diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -2421,10 +2421,15 @@ log_cleanup_range(logger *lg, ulng id)
 static void
 do_rotate(logger *lg)
 {
-       logged_range *next = lg->current->next;
+       logged_range *cur = lg->current;
+       logged_range *next = cur->next;
        if (next) {
                assert(ATOMIC_GET(&next->refcount) == 1);
-               lg->current = lg->current->next;
+               lg->current = next;
+               if (!LOG_DISABLED(lg) && ATOMIC_GET(&cur->refcount) == 1) {
+                       close_stream(cur->output_log);
+                       cur->output_log = NULL;
+               }
        }
 }
 
@@ -3099,7 +3104,14 @@ log_tflush(logger *lg, ulng file_id, uln
        }
        /* else somebody else has flushed our log file */
 
-       ATOMIC_DEC(&frange->refcount);
+       if (ATOMIC_DEC(&frange->refcount) == 1 && !LOG_DISABLED(lg)) {
+               rotation_lock(lg);
+               if (frange != lg->current) {
+                       close_stream(frange->output_log);
+                       frange->output_log = NULL;
+               }
+               rotation_unlock(lg);
+       }
 
        if (ATOMIC_DEC(&lg->nr_flushers) == 0) {
                /* I am the last flusher
diff --git a/monetdb5/mal/Tests/All b/monetdb5/mal/Tests/All
--- a/monetdb5/mal/Tests/All
+++ b/monetdb5/mal/Tests/All
@@ -46,7 +46,7 @@ tst045
 tst046
 tst047
 tst048
-tst049
+HAVE_LIBPCRE?tst049
 tst050
 tst051
 tst052
diff --git a/monetdb5/modules/atoms/json.c b/monetdb5/modules/atoms/json.c
--- a/monetdb5/modules/atoms/json.c
+++ b/monetdb5/modules/atoms/json.c
@@ -140,6 +140,14 @@ JSONtoStorageString(JSON *jt, int idx, j
        size_t sz = 0;
        str msg = MAL_SUCCEED;
 
+       if (THRhighwater()) {
+               msg = createException(MAL, "json.new",
+                                                                       
SQLSTATE(42000)
+                                                                       "JSON 
object too complex to render into string.");
+               return msg;
+       }
+
+
        switch(jt->elm[idx].kind) {
        case JSON_OBJECT:
                *p++ = '{';
diff --git a/monetdb5/modules/atoms/str.c b/monetdb5/modules/atoms/str.c
--- a/monetdb5/modules/atoms/str.c
+++ b/monetdb5/modules/atoms/str.c
@@ -65,6 +65,7 @@
 #include <string.h>
 #ifdef HAVE_ICONV
 #include <iconv.h>
+#include <locale.h>
 #endif
 #include "mal_interpreter.h"
 
@@ -5046,37 +5047,40 @@ static str
 STRasciify(str *r, const str *s)
 {
 #ifdef HAVE_ICONV
-       /* Handle NULL and return early */
+
        if (strNil(*s)) {
                if ((*r = GDKstrdup(str_nil)) == NULL)
                        throw(MAL, "str.asciify", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
                else
                        return MAL_SUCCEED;
        }
+
        iconv_t cd;
        const str f = "UTF-8", t = "ASCII//TRANSLIT";
        str in = *s, out;
-       size_t in_len = strlen(in), out_len = in_len * 4;       /* oversized as 
a single utf8 char could change into multiple
-                                                                               
                                   ascii char */
-       /* man iconv; /TRANSLIT */
+       size_t in_len = strlen(in), out_len = in_len * 4; /* oversized as a 
single utf8 char could change into multiple ascii char */
+
        if ((cd = iconv_open(t, f)) == (iconv_t) (-1))
-               throw(MAL, "str.asciify", "ICONV: cannot convert from (%s) to 
(%s).", f,
-                         t);
+               throw(MAL, "str.asciify", "ICONV: cannot convert from (%s) to 
(%s).", f, t);
+
        if ((*r = out = GDKmalloc(out_len)) == NULL) {
                iconv_close(cd);
                throw(MAL, "str.asciify", SQLSTATE(HY013) MAL_MALLOC_FAIL);
        }
+
        str o = out;
+
        if (iconv(cd, &in, &in_len, &o, &out_len) == (size_t) -1) {
                GDKfree(out);
                *r = NULL;
                iconv_close(cd);
-               throw(MAL, "str.asciify",
-                         "ICONV: string conversion failed from (%s) to (%s)", 
f, t);
+               throw(MAL, "str.asciify", "Conversion failed, possibly due to 
system locale %s.", setlocale(0, NULL));
        }
+
        *o = '\0';
        iconv_close(cd);
        return MAL_SUCCEED;
+
 #else
        throw(MAL, "str.asciify", "ICONV library not available.");
 #endif
diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -2837,7 +2837,6 @@ rel2bin_groupjoin(backend *be, sql_rel *
 
        en = jexps?jexps->h:NULL;
        if (list_empty(jexps) || !(is_equi_exp_((sql_exp*)en->data) && 
can_join_exp(rel, en->data, false))) {
-               printf("# outer cross\n");
                stmt *l = bin_find_smallest_column(be, left);
                stmt *r = bin_find_smallest_column(be, right);
                if (list_empty(jexps)) {
@@ -2878,7 +2877,6 @@ rel2bin_groupjoin(backend *be, sql_rel *
                        /* split out (left)join vs (left)mark-join */
                        /* call 3 result version */
                        if (mark && is_any(e)) {
-                               printf("# mark join 3\n");
                                join = stmt_markjoin(be, l, r, 0);
                        } else
                                join = stmt_join_cand(be, column(be, l), 
column(be, r), left->cand, NULL/*right->cand*/, is_anti(e), (comp_type) 
cmp_equal/*e->flag*/, 0, is_any(e)|is_semantics(e), false, rel->op == 
op_left?false:true);
@@ -2887,7 +2885,6 @@ rel2bin_groupjoin(backend *be, sql_rel *
                        if (mark && is_any(e))
                                m = stmt_result(be, join, 2);
                } else {
-                       printf("# mark join 2\n");
                        join = stmt_markjoin(be, l, r, 1);
                        jl = stmt_result(be, join, 0);
                        m = stmt_result(be, join, 1);
@@ -2954,10 +2951,8 @@ rel2bin_groupjoin(backend *be, sql_rel *
                                li = stmt_project(be, sel, li);
                        osel = sel;
                        if (en->next) {
-                               printf("# outer select\n");
                                join = stmt_outerselect(be, li, m, p, 
is_any(e));
                        } else {
-                               printf("# mark select\n");
                                join = stmt_markselect(be, li, m, p, is_any(e));
                        }
                        sel = stmt_result(be, join, 0);
diff --git a/sql/common/sql_types.c b/sql/common/sql_types.c
--- a/sql/common/sql_types.c
+++ b/sql/common/sql_types.c
@@ -937,6 +937,7 @@ sqltypeinit( sql_allocator *sa)
        /* needed for indices/clusters oid(schema.table,val) returns 
max(head(schema.table))+1 */
        sql_create_func(sa, "rowid", "calc", "rowid", TRUE, TRUE, SCALE_NONE, 
0, OID, 3, ANY, STR, STR);
        sql_create_aggr(sa, "min", "aggr", "min", FALSE, FALSE, ANY, 1, ANY);
+       sql_create_aggr(sa, "any_value", "aggr", "min", FALSE, FALSE, ANY, 1, 
ANY);
        sql_create_aggr(sa, "max", "aggr", "max", FALSE, FALSE, ANY, 1, ANY);
        sql_create_func(sa, "sql_min", "calc", "min", FALSE, FALSE, SCALE_FIX, 
0, ANY, 2, ANY, ANY);
        sql_create_func(sa, "sql_max", "calc", "max", FALSE, FALSE, SCALE_FIX, 
0, ANY, 2, ANY, ANY);
@@ -1095,6 +1096,7 @@ sqltypeinit( sql_allocator *sa)
 
        sql_create_analytic(sa, "count", "sql", "count", FALSE, SCALE_NONE, 
LNG, 2, ANY, BIT);
        sql_create_analytic(sa, "min", "sql", "min", FALSE, SCALE_NONE, ANY, 1, 
ANY);
+       sql_create_analytic(sa, "any_value", "sql", "min", FALSE, SCALE_NONE, 
ANY, 1, ANY);
        sql_create_analytic(sa, "max", "sql", "max", FALSE, SCALE_NONE, ANY, 1, 
ANY);
 
        /* analytical sum for numerical and decimals */
@@ -1511,8 +1513,8 @@ sqltypeinit( sql_allocator *sa)
                sql_create_func(sa, "ucase", "str", "toUpper", FALSE, FALSE, 
INOUT, 0, *t, 1, *t);
                sql_create_func(sa, "lower", "str", "toLower", FALSE, FALSE, 
INOUT, 0, *t, 1, *t);
                sql_create_func(sa, "lcase", "str", "toLower", FALSE, FALSE, 
INOUT, 0, *t, 1, *t);
-               sql_create_func(sa, "trim", "str", "trim", FALSE, FALSE, INOUT, 
0, *t, 1, *t);
-               sql_create_func(sa, "trim", "str", "trim2", FALSE, FALSE, 
INOUT, 0, *t, 2, *t, *t);
+               sql_create_func(sa, "btrim", "str", "trim", FALSE, FALSE, 
INOUT, 0, *t, 1, *t);
+               sql_create_func(sa, "btrim", "str", "trim2", FALSE, FALSE, 
INOUT, 0, *t, 2, *t, *t);
                sql_create_func(sa, "ltrim", "str", "ltrim", FALSE, FALSE, 
INOUT, 0, *t, 1, *t);
                sql_create_func(sa, "ltrim", "str", "ltrim2", FALSE, FALSE, 
INOUT, 0, *t, 2, *t, *t);
                sql_create_func(sa, "rtrim", "str", "rtrim", FALSE, FALSE, 
INOUT, 0, *t, 1, *t);
diff --git a/sql/server/rel_optimize_proj.c b/sql/server/rel_optimize_proj.c
--- a/sql/server/rel_optimize_proj.c
+++ b/sql/server/rel_optimize_proj.c
@@ -3069,6 +3069,20 @@ rel_push_join_down_union(visitor *v, sql
                list *exps = rel->exps, *attr = rel->attr;
                sql_exp *je = NULL;
 
+               /* we would like to optimize in place reference rels which point
+                * to replica tables and let the replica optimizer handle those
+                * later. otherwise we miss the push join down optimization due
+                * to the rel_is_ref bailout
+                */
+               if (rel_is_ref(l) && is_basetable(l->op) && l->l && 
isReplicaTable((sql_table*)l->l)) {
+                       rel->l = rel_copy(v->sql, l, true);
+                       rel_destroy(l);
+               }
+               if (rel_is_ref(r) && is_basetable(r->op) && r->l && 
isReplicaTable((sql_table*)r->l)) {
+                       rel->r = rel_copy(v->sql, r, true);
+                       rel_destroy(r);
+               }
+
                if (!l || !r || need_distinct(l) || need_distinct(r) || 
rel_is_ref(l) || rel_is_ref(r))
                        return rel;
                if (l->op == op_project)
diff --git a/sql/server/sql_parser.y b/sql/server/sql_parser.y
--- a/sql/server/sql_parser.y
+++ b/sql/server/sql_parser.y
@@ -63,9 +63,11 @@ makeAtomNode(mvc *m, const char* type, c
 #ifdef HAVE_HGE
 #define MAX_DEC_DIGITS 38
 #define MAX_HEX_DIGITS 32
+#define MAX_OCT_DIGITS 64 /* TODO */
 #else
 #define MAX_DEC_DIGITS 18
 #define MAX_HEX_DIGITS 16
+#define MAX_OCT_DIGITS 32 /* TODO */
 #endif
 
 static inline int
@@ -421,6 +423,8 @@ int yydebug=1;
        opt_null_string
        opt_to_savepoint
        opt_uescape
+       opt_trim_type
+       opt_trim_characters
        opt_using
        opt_XML_attribute_name
        restricted_ident
@@ -636,7 +640,7 @@ int yydebug=1;
 
 /* sql prefixes to avoid name clashes on various architectures */
 %token <sval>
-       IDENT UIDENT aTYPE ALIAS RANK sqlINT OIDNUM HEXADECIMAL INTNUM APPROXNUM
+       IDENT UIDENT aTYPE ALIAS RANK sqlINT OIDNUM HEXADECIMALNUM OCTALNUM 
BINARYNUM INTNUM APPROXNUM
        USING
        GLOBAL CAST CONVERT
        CHARACTER VARYING LARGE OBJECT VARCHAR CLOB sqlTEXT BINARY sqlBLOB
@@ -694,7 +698,7 @@ int yydebug=1;
 %left <operation> ALL ANY NOT_BETWEEN BETWEEN NOT_IN sqlIN NOT_EXISTS EXISTS 
NOT_LIKE LIKE NOT_ILIKE ILIKE OR SOME
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to