Changeset: f5d791884514 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/f5d791884514
Removed Files:
monetdb5/modules/atoms/Tests/asciify.test
monetdb5/modules/atoms/Tests/endswith.test
monetdb5/modules/kernel/Tests/batstr_asciify.test
Modified Files:
monetdb5/modules/atoms/Tests/All
monetdb5/modules/kernel/Tests/All
sql/test/strings/Tests/All
sql/test/strings/Tests/asciify.test
sql/test/strings/Tests/batstr_asciify.test
sql/test/strings/Tests/endswith.test
Branch: ascii-flag
Log Message:
Merge with default branch.
diffs (truncated from 1030 to 300 lines):
diff --git a/gdk/gdk_select.c b/gdk/gdk_select.c
--- a/gdk/gdk_select.c
+++ b/gdk/gdk_select.c
@@ -1206,6 +1206,9 @@ BATrange(BATiter *bi, const void *tl, co
if (tl == NULL && th == NULL)
return range_contains; /* looking for everything */
+ if (VIEWtparent(bi->b))
+ pb = BATdescriptor(VIEWtparent(bi->b));
+
/* keep locked while we look at the property values */
MT_lock_set(&bi->b->theaplock);
if (bi->minpos != BUN_NONE)
@@ -1221,8 +1224,7 @@ BATrange(BATiter *bi, const void *tl, co
}
bool keep = false; /* keep lock on parent bat? */
if (minprop == NULL || maxprop == NULL) {
- if (VIEWtparent(bi->b) &&
- (pb = BATdescriptor(VIEWtparent(bi->b))) != NULL) {
+ if (pb != NULL) {
MT_lock_set(&pb->theaplock);
if (minprop == NULL && (minprop = BATgetprop_nolock(pb,
GDK_MIN_BOUND)) != NULL) {
keep = true;
diff --git a/gdk/gdk_system.c b/gdk/gdk_system.c
--- a/gdk/gdk_system.c
+++ b/gdk/gdk_system.c
@@ -280,15 +280,16 @@ dump_threads(void)
char buf[1024];
thread_lock();
for (struct mtthread *t = mtthreads; t; t = t->next) {
+ MT_Lock *lk = t->lockwait;
+ MT_Sema *sm = t->semawait;
+ MT_Cond *cn = t->condwait;
+ struct mtthread *jn = t->joinwait;
int pos = snprintf(buf, sizeof(buf),
- "%s, tid %zu, waiting for %s, working on
%.200s",
+ "%s, tid %zu, waiting for %s%s, working on
%.200s",
t->threadname,
t->tid,
- t->lockwait ? t->lockwait->name :
- t->semawait ? t->semawait->name :
- t->condwait ? t->condwait->name :
- t->joinwait ? t->joinwait->threadname :
- "nothing",
+ lk ? "lock " : sm ? "semaphore " : cn ?
"condvar " : jn ? "thread " : "",
+ lk ? lk->name : sm ? sm->name : cn ?
cn->name : jn ? jn->threadname : "nothing",
ATOMIC_GET(&t->exited) ? "exiting" :
t->working ? t->working : "nothing");
#ifdef LOCK_OWNER
diff --git a/gdk/gdk_system.h b/gdk/gdk_system.h
--- a/gdk/gdk_system.h
+++ b/gdk/gdk_system.h
@@ -498,7 +498,6 @@ typedef struct MT_Lock {
#define MT_lock_try(l) (pthread_mutex_trylock(&(l)->lock) == 0 &&
(_DBG_LOCK_LOCKER(l), true))
-#ifdef LOCK_STATS
#define MT_lock_set(l) \
do { \
_DBG_LOCK_COUNT_0(l); \
@@ -511,14 +510,6 @@ typedef struct MT_Lock {
_DBG_LOCK_LOCKER(l); \
_DBG_LOCK_COUNT_2(l); \
} while (0)
-#else
-#define MT_lock_set(l) \
- do { \
- pthread_mutex_lock(&(l)->lock); \
- _DBG_LOCK_LOCKER(l); \
- } while (0)
-#endif
-
#define MT_lock_unset(l) \
do { \
_DBG_LOCK_UNLOCKER(l); \
diff --git a/monetdb5/modules/atoms/Tests/All b/monetdb5/modules/atoms/Tests/All
--- a/monetdb5/modules/atoms/Tests/All
+++ b/monetdb5/modules/atoms/Tests/All
@@ -33,13 +33,3 @@ jsonrender
uuid00
strappend
-
-startswith
-endswith
-contains
-asciify
-startswith_join
-endswith_join
-contains_join
-
-ts_and_tstz_to_str_bug
diff --git a/monetdb5/modules/kernel/Tests/All
b/monetdb5/modules/kernel/Tests/All
--- a/monetdb5/modules/kernel/Tests/All
+++ b/monetdb5/modules/kernel/Tests/All
@@ -3,8 +3,3 @@ TriBool
batstr
math
select
-
-batstr_asciify
-batstr_startswith
-batstr_endswith
-batstr_contains
diff --git a/monetdb5/modules/mal/Tests/All b/monetdb5/modules/mal/Tests/All
--- a/monetdb5/modules/mal/Tests/All
+++ b/monetdb5/modules/mal/Tests/All
@@ -52,6 +52,3 @@ orderidx00
orderidx01
orderidx02
orderidx04
-
-txtsim_levenshtein
-txtsim_jarowinkler
diff --git a/monetdb5/optimizer/opt_aliases.c b/monetdb5/optimizer/opt_aliases.c
--- a/monetdb5/optimizer/opt_aliases.c
+++ b/monetdb5/optimizer/opt_aliases.c
@@ -17,16 +17,8 @@
/* an alias is recognized by a simple assignment */
#define OPTisAlias(X) (X->argc == 2 && X->token == ASSIGNsymbol && X->barrier
== 0 )
-static inline void
-OPTaliasRemap(InstrPtr p, int *alias)
-{
- for (int i = 0; i < p->argc; i++)
- getArg(p, i) = alias[getArg(p, i)];
-}
-
str
-OPTaliasesImplementation(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
- InstrPtr pci)
+OPTaliasesImplementation(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr
pci)
{
int i, j, k = 1, limit, actions = 0;
int *alias = 0;
@@ -67,7 +59,8 @@ OPTaliasesImplementation(Client cntxt, M
k--;
mb->stmt[k] = 0;
} else {
- OPTaliasRemap(p, alias);
+ for (int i = 0; i < p->argc; i++)
+ getArg(p, i) = alias[getArg(p, i)];
}
}
diff --git a/monetdb5/optimizer/opt_candidates.c
b/monetdb5/optimizer/opt_candidates.c
--- a/monetdb5/optimizer/opt_candidates.c
+++ b/monetdb5/optimizer/opt_candidates.c
@@ -19,12 +19,13 @@
#include "opt_candidates.h"
str
-OPTcandidatesImplementation(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
- InstrPtr pci)
+OPTcandidatesImplementation(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr pci)
{
InstrPtr p;
str msg = MAL_SUCCEED;
+ if (!(ATOMIC_GET(&GDKdebug) & FORCEMITOMASK))
+ goto wrapup;
(void) cntxt;
(void) stk; /* to fool compilers */
for (int i = 0; i < mb->stop; i++) {
@@ -88,6 +89,7 @@ OPTcandidatesImplementation(Client cntxt
// if( ms== MAL_SUCCEED)
// msg = chkDeclarations(mb);
/* keep actions taken as a fake argument */
+wrapup:
(void) pushInt(mb, pci, 1);
return msg;
}
diff --git a/sql/ChangeLog b/sql/ChangeLog
--- a/sql/ChangeLog
+++ b/sql/ChangeLog
@@ -1,6 +1,11 @@
# ChangeLog file for sql
# This file is updated with Maddlog
+* Thu Mar 21 2024 Yunus Koning <[email protected]>
+- Introduce IS [NOT] DISTINCT FROM syntax. The syntax allows two values
+ to be compared. The comparison always returns boolean FALSE or TRUE
+ never NULL.
+
* Wed Mar 6 2024 Yunus Koning <[email protected]>
- SQL2023 feature: Introduce UNIQUE NULLS [NOT] DISTINCT syntax which
allows for NULLS to be treated as unique, i.e. a column with this
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
@@ -1831,8 +1831,8 @@ exp_bin(backend *be, sql_exp *e, stmt *l
tail_type(l), tail_type(l), F_FUNC, true, true);
assert(f);
if (is_semantics(e)) {
- if (exp_is_null(e->l) &&
exp_is_null(e->r)) {
- s = stmt_bool(be,
!is_anti(e));
+ if (exp_is_null(e->l) &&
exp_is_null(e->r) && (e->flag == cmp_equal || e->flag == cmp_notequal)) {
+ s = stmt_bool(be,
e->flag == cmp_equal ? !is_anti(e): is_anti(e));
} else {
list *args =
sa_list(sql->sa);
if (args == NULL)
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -2367,6 +2367,8 @@ rel_logical_value_exp(sql_query *query,
int quantifier = 0, need_not = 0;
sql_exp *rs = NULL, *ls;
comp_type cmp_type = compare_str2type(compare_op);
+ bool is_not_distinct_from = false;
+ bool is_distinct_from = false;
/*
* = ANY -> IN, <> ALL -> NOT( = ANY) -> NOT IN
@@ -2374,7 +2376,17 @@ rel_logical_value_exp(sql_query *query,
*/
if (n->next->next->next)
quantifier = n->next->next->next->data.i_val + 1;
- assert(quantifier == 0 || quantifier == 1 || quantifier == 2);
+ assert(quantifier == 0 || quantifier == 1 || quantifier == 2 ||
quantifier == 3 || quantifier == 4);
+
+ /* [NOT] DISTINCT FROM */
+ if (quantifier == 3) {
+ is_not_distinct_from = true;
+ quantifier = 0;
+ }
+ else if (quantifier == 4) {
+ is_distinct_from = true;
+ quantifier = 0;
+ }
if ((quantifier == 1 && cmp_type == cmp_equal) ||
(quantifier == 2 && cmp_type == cmp_notequal)) {
@@ -2405,6 +2417,15 @@ rel_logical_value_exp(sql_query *query,
rs = rel_value_exp(query, rel, ro, f|sql_farg, ek);
if (!rs)
return NULL;
+
+ if (is_distinct_from || is_not_distinct_from) {
+ if (rel_convert_types(sql, rel ? *rel : NULL, rel ?
*rel : NULL, &ls, &rs, 1, type_equal_no_any) < 0)
+ return NULL;
+ sql_exp* e = exp_compare(sql->sa, ls, rs,
is_not_distinct_from?cmp_equal:cmp_notequal);
+ set_semantics(e);
+ return e;
+ }
+
if (rs->type == e_atom)
quantifier = 0;
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
@@ -3909,6 +3909,20 @@ comparison_predicate:
append_symbol(l, $5);
append_int(l, $3);
$$ = _symbol_create_list(SQL_COMPARE, l ); }
+ | pred_exp IS NOT DISTINCT FROM pred_exp
+ { dlist *l = L();
+ append_symbol(l, $1);
+ append_string(l, sa_strdup(SA, "="));
+ append_symbol(l, $6);
+ append_int(l, 2);
+ $$ = _symbol_create_list(SQL_COMPARE, l ); }
+ | pred_exp IS DISTINCT FROM pred_exp
+ { dlist *l = L();
+ append_symbol(l, $1);
+ append_string(l, sa_strdup(SA, "="));
+ append_symbol(l, $5);
+ append_int(l, 3);
+ $$ = _symbol_create_list(SQL_COMPARE, l ); }
;
between_predicate:
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -57,10 +57,10 @@ ulng
store_oldest(sqlstore *store, sql_trans *tr)
{
if (tr && tr->ts == (ulng) ATOMIC_GET(&store->oldest)) {
- sql_session *s = store->active->h->data;
- if (s->tr == tr && store->active->h->next) {
- s = store->active->h->next->data;
- return s->tr->ts;
+ sql_trans *otr = store->active->h->data;
+ if (otr == tr && store->active->h->next) {
+ otr = store->active->h->next->data;
+ return otr->ts;
}
}
return (ulng) ATOMIC_GET(&store->oldest);
diff --git a/sql/test/2024/Tests/All b/sql/test/2024/Tests/All
--- a/sql/test/2024/Tests/All
+++ b/sql/test/2024/Tests/All
@@ -1,1 +1,2 @@
groupby_primary_key_project_unique_key
+distinct_from
diff --git a/sql/test/2024/Tests/distinct_from.test
b/sql/test/2024/Tests/distinct_from.test
new file mode 100644
--- /dev/null
+++ b/sql/test/2024/Tests/distinct_from.test
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]