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 -- [email protected]
To unsubscribe send an email to [email protected]