Changeset: fb5710a8bad2 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/fb5710a8bad2 Branch: default Log Message:
Merge heads. diffs (truncated from 2090 to 300 lines): 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/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/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/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 %left <operation> AND %left <sval> COMPARISON /* <> < > <= >= */ -%left <operation> '+' '-' '&' '|' '^' LEFT_SHIFT RIGHT_SHIFT LEFT_SHIFT_ASSIGN RIGHT_SHIFT_ASSIGN CONCATSTRING SUBSTRING POSITION SPLIT_PART +%left <operation> '+' '-' '&' '|' '^' LEFT_SHIFT RIGHT_SHIFT LEFT_SHIFT_ASSIGN RIGHT_SHIFT_ASSIGN CONCATSTRING SUBSTRING TRIM POSITION SPLIT_PART %left <operation> '*' '/' '%' %left UMINUS %left <operation> '~' @@ -721,6 +725,7 @@ SQLCODE SQLERROR UNDER WHENEVER %token PATH PRIMARY PRIVILEGES %token<sval> PUBLIC REFERENCES SCHEMA SET AUTO_COMMIT %token RETURN +%token LEADING TRAILING BOTH %token ALTER ADD TABLE COLUMN TO UNIQUE VALUES VIEW WHERE WITH WITHOUT %token<sval> sqlDATE TIME TIMESTAMP INTERVAL @@ -4501,6 +4506,18 @@ opt_brackets: | '(' ')' { $$ = 1; } ; +opt_trim_type: + /* empty */ { $$ = NULL; } + | LEADING {$$ = "ltrim"; } + | TRAILING {$$ = "rtrim"; } + | BOTH {$$ = "btrim"; } + ; + +opt_trim_characters: + /* empty */ { $$ = NULL; } + | string {$$ = $1; } + ; + string_funcs: SUBSTRING '(' scalar_exp FROM scalar_exp FOR scalar_exp ')' { dlist *l = L(); @@ -4567,6 +4584,38 @@ string_funcs: append_symbol(ops, $7); append_list(l, ops); $$ = _symbol_create_list( SQL_NOP, l ); } +| TRIM '(' opt_trim_type opt_trim_characters FROM scalar_exp ')' + { dlist *l = L(); + if ( $3 == NULL && $4 == NULL ) { + sqlformaterror(m, SQLSTATE(2000) "%s", "trim specification or trim characters need to be specified preceding FROM in TRIM"); + YYABORT; + } + append_list(l, + append_string(L(), sa_strdup(SA, $3?$3:"btrim"))); + append_int(l, FALSE); /* ignore distinct */ + append_symbol(l, $6); + + char* s = $4?$4:" "; + int len = UTF8_strlen(s); + sql_subtype t; + sql_find_subtype(&t, "char", len, 0 ); + append_symbol(l, _newAtomNode( _atom_string(&t, s))); + $$ = _symbol_create_list( SQL_BINOP, l ); } +| TRIM '(' scalar_exp ',' scalar_exp ')' + { dlist *l = L(); + append_list(l, + append_string(L(), sa_strdup(SA, "btrim"))); + append_int(l, FALSE); /* ignore distinct */ + append_symbol(l, $3); + append_symbol(l, $5); + $$ = _symbol_create_list( SQL_BINOP, l ); } +| TRIM '(' scalar_exp ')' + { dlist *l = L(); + append_list(l, + append_string(L(), sa_strdup(SA, "btrim"))); + append_int(l, FALSE); /* ignore distinct */ + append_symbol(l, $3); + $$ = _symbol_create_list( SQL_UNOP, l ); } ; column_exp_commalist: @@ -4857,7 +4906,123 @@ literal: sql_find_subtype(&t, "char", len, 0 ); $$ = _newAtomNode( _atom_string(&t, s)); } - | HEXADECIMAL { int len = _strlen($1), i = 2, err = 0; + | BINARYNUM { int len = _strlen($1), i = 2, err = 0; + char * binary = $1; + sql_subtype t; +#ifdef HAVE_HGE + hge res = 0; +#else + lng res = 0; +#endif + /* skip leading '0' */ + while (i < len && binary[i] == '0') + i++; + + if (len - i < MAX_OCT_DIGITS || (len - i == MAX_OCT_DIGITS && binary[i] < '2')) + while (err == 0 && i < len) + { + if (binary[i] == '_') { + i++; + continue; + } + res <<= 1; + if (binary[i] == '0' || binary[i] == '1') // TODO: an be asserted + res = res + (binary[i] - '0'); + else + err = 1; + i++; + } + else + err = 1; + _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org