Changeset: c14db874309b for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/c14db874309b
Branch: check
Log Message:
merge with default
diffs (288 lines):
diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml
--- a/.github/workflows/linux.yml
+++ b/.github/workflows/linux.yml
@@ -48,7 +48,12 @@ jobs:
ref: ${{ github.ref }}
- name: install pymonetdb cryptography
- run: pip3 install pymonetdb cryptography
+ run: pip3 install --user --upgrade pymonetdb cryptography
+ if: runner.os != 'macOS'
+
+ - name: install pymonetdb cryptography
+ run: pip3 install --user --break-system-packages --upgrade pymonetdb
cryptography
+ if: runner.os == 'macOS'
- name: make MonetDB on linux
run: |
@@ -83,7 +88,23 @@ jobs:
-DBISON_EXECUTABLE=/usr/local/opt/bison/bin/bison \
-DCMAKE_SUMMARY=ON
make install -j3
- if: runner.os == 'macOS'
+ if: runner.os == 'macOS' && runner.arch == 'x64'
+
+ - name: make MonetDB on macos
+ run: |
+ mkdir build
+ cd build
+ cmake .. \
+ -DCMAKE_INSTALL_PREFIX=$HOME/MDB \
+ -DPY3INTEGRATION=OFF \
+ -DRINTEGRATION=OFF \
+ -DCMAKE_BUILD_TYPE=Release \
+ -DASSERT=OFF \
+ -DCMAKE_C_COMPILER=${{ matrix.c_compiler }} \
+ -DBISON_EXECUTABLE=/opt/homebrew/opt/bison/bin/bison \
+ -DCMAKE_SUMMARY=ON
+ make install -j3
+ if: runner.os == 'macOS' && runner.arch == 'arm64'
- name: choco packages
run: |
diff --git a/clients/odbc/driver/SQLConnect.c b/clients/odbc/driver/SQLConnect.c
--- a/clients/odbc/driver/SQLConnect.c
+++ b/clients/odbc/driver/SQLConnect.c
@@ -251,7 +251,7 @@ MNDBConnect(ODBCDbc *dbc,
}
if (mid == NULL || mapi_error(mid)) {
/* Client unable to establish connection */
- addDbcError(dbc, "08001", NULL, 0);
+ addDbcError(dbc, "08001", mid ? mapi_error_str(mid) : NULL, 0);
rc = SQL_ERROR;
/* clean up */
if (mid)
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -4065,6 +4065,33 @@ BBPsync(int cnt, bat *restrict subcommit
if (lock)
MT_lock_set(&GDKswapLock(bid));
}
+ if (subcommit) {
+ /* move any tail/theap files we find for this bat that
+ * are in the BACKUP directory to the SUBCOMMIT
+ * directory */
+ char fname[16]; /* plenty big enough */
+ if (snprintf(fname, sizeof(fname), "%o", i) < 16) {
+ /* the snprintf never fails, any of the
+ * below may fail */
+ if (GDKmove(0, BAKDIR, fname, "tail", SUBDIR,
fname, "tail", false) == GDK_SUCCEED)
+ TRC_DEBUG(BAT_, "moved %s.tail from %s
to %s\n",
+ fname, BAKDIR, SUBDIR);
+ if (GDKmove(0, BAKDIR, fname, "tail1", SUBDIR,
fname, "tail1", false) == GDK_SUCCEED)
+ TRC_DEBUG(BAT_, "moved %s.tail1 from %s
to %s\n",
+ fname, BAKDIR, SUBDIR);
+ if (GDKmove(0, BAKDIR, fname, "tail2", SUBDIR,
fname, "tail2", false) == GDK_SUCCEED)
+ TRC_DEBUG(BAT_, "moved %s.tail2 from %s
to %s\n",
+ fname, BAKDIR, SUBDIR);
+#if SIZEOF_VAR_T == 8
+ if (GDKmove(0, BAKDIR, fname, "tail4", SUBDIR,
fname, "tail4", false) == GDK_SUCCEED)
+ TRC_DEBUG(BAT_, "moved %s.tail4 from %s
to %s\n",
+ fname, BAKDIR, SUBDIR);
+#endif
+ if (GDKmove(0, BAKDIR, fname, "theap", SUBDIR,
fname, "theap", false) == GDK_SUCCEED)
+ TRC_DEBUG(BAT_, "moved %s.theap from %s
to %s\n",
+ fname, BAKDIR, SUBDIR);
+ }
+ }
BAT *b = dirty_bat(&i, subcommit != NULL);
if (i <= 0)
ret = GDK_FAIL;
diff --git a/monetdb5/modules/mal/pcre.c b/monetdb5/modules/mal/pcre.c
--- a/monetdb5/modules/mal/pcre.c
+++ b/monetdb5/modules/mal/pcre.c
@@ -733,6 +733,7 @@ single_replace(pcre *pcre_code, pcre_ext
int offset = 0;
int len_result = 0;
int addlen;
+ int empty_match_correction = 0;
char *tmp;
do {
@@ -740,7 +741,12 @@ single_replace(pcre *pcre_code, pcre_ext
exec_options, ovector,
ovecsize);
if (j <= 0)
break;
- addlen = ovector[0] - offset + (nbackrefs == 0 ?
len_replacement : 0);
+
+ empty_match_correction = ovector[0] == ovector[1] ? 1 : 0;
+
+ // calculate the length of the string that will be appended to
result
+ addlen = ovector[0] - offset
+ + (nbackrefs == 0 ? len_replacement : 0) +
empty_match_correction;
if (len_result + addlen >= *max_result) {
tmp = GDKrealloc(result, len_result + addlen + 1);
if (tmp == NULL) {
@@ -750,11 +756,13 @@ single_replace(pcre *pcre_code, pcre_ext
result = tmp;
*max_result = len_result + addlen + 1;
}
+ // append to the result the parts of the original string that
are left unchanged
if (ovector[0] > offset) {
strncpy(result + len_result, origin_str + offset,
ovector[0] - offset);
len_result += ovector[0] - offset;
}
+ // append to the result the replacement of the matched string
if (nbackrefs == 0) {
strncpy(result + len_result, replacement,
len_replacement);
len_result += len_replacement;
@@ -807,8 +815,18 @@ single_replace(pcre *pcre_code, pcre_ext
len_result += addlen;
}
}
- offset = ovector[1];
- } while (offset < len_origin_str && global);
+ // In case of an empty match just advance the offset by 1
+ offset = ovector[1] + empty_match_correction;
+ // and copy the character that we just advanced over
+ if (empty_match_correction) {
+ strncpy(result + len_result, origin_str + ovector[1],
1);
+ ++len_result;
+ }
+ // before we loop around check with the offset - 1 if we had an
empty match
+ // since we manually advanced the offset by one. otherwise we
gonna skip a
+ // replacement at the end of the string
+ } while ((offset - empty_match_correction) < len_origin_str && global);
+
if (offset < len_origin_str) {
addlen = len_origin_str - offset;
if (len_result + addlen >= *max_result) {
diff --git a/monetdb5/modules/mal/tablet.c b/monetdb5/modules/mal/tablet.c
--- a/monetdb5/modules/mal/tablet.c
+++ b/monetdb5/modules/mal/tablet.c
@@ -1945,8 +1945,7 @@ SQLload_file(Client cntxt, Tablet *as, b
return BUN_NONE;
}
-/* return the latest reject table, to be on the safe side we should
- * actually create copies within a critical section. Ignored for now. */
+/* return the latest reject table */
str
COPYrejects(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
{
@@ -1958,10 +1957,27 @@ COPYrejects(Client cntxt, MalBlkPtr mb,
create_rejects_table(cntxt);
if (cntxt->error_row == NULL)
throw(MAL, "sql.rejects", "No reject table available");
- BBPretain(*row = cntxt->error_row->batCacheid);
- BBPretain(*fld = cntxt->error_fld->batCacheid);
- BBPretain(*msg = cntxt->error_msg->batCacheid);
- BBPretain(*inp = cntxt->error_input->batCacheid);
+ MT_lock_set(&errorlock);
+ BAT *bn1 = COLcopy(cntxt->error_row, cntxt->error_row->ttype, true,
TRANSIENT);
+ BAT *bn2 = COLcopy(cntxt->error_fld, cntxt->error_fld->ttype, true,
TRANSIENT);
+ BAT *bn3 = COLcopy(cntxt->error_msg, cntxt->error_msg->ttype, true,
TRANSIENT);
+ BAT *bn4 = COLcopy(cntxt->error_input, cntxt->error_input->ttype, true,
TRANSIENT);
+ MT_lock_unset(&errorlock);
+ if (bn1 == NULL || bn2 == NULL || bn3 == NULL || bn4 == NULL) {
+ BBPreclaim(bn1);
+ BBPreclaim(bn2);
+ BBPreclaim(bn3);
+ BBPreclaim(bn4);
+ throw(MAL, "sql.rejects", GDK_EXCEPTION);
+ }
+ *row = bn1->batCacheid;
+ *fld = bn2->batCacheid;
+ *msg = bn3->batCacheid;
+ *inp = bn4->batCacheid;
+ BBPkeepref(bn1);
+ BBPkeepref(bn2);
+ BBPkeepref(bn3);
+ BBPkeepref(bn4);
(void) mb;
return MAL_SUCCEED;
}
diff --git a/sql/storage/bat/bat_storage.c b/sql/storage/bat/bat_storage.c
--- a/sql/storage/bat/bat_storage.c
+++ b/sql/storage/bat/bat_storage.c
@@ -4472,7 +4472,7 @@ tc_gc_col( sql_store Store, sql_change *
return LOG_OK; /* cannot cleanup yet */
// d is oldest reachable delta
- if (d->next) // Unreachable can immediately be destroyed.
+ if (d->cs.merged && d->next) // Unreachable can immediately be
destroyed.
destroy_delta(d->next, true);
d->next = NULL;
@@ -4512,7 +4512,7 @@ tc_gc_upd_col( sql_store Store, sql_chan
return LOG_OK; /* cannot cleanup yet */
// d is oldest reachable delta
- if (d->next) // Unreachable can immediately be destroyed.
+ if (d->cs.merged && d->next) // Unreachable can immediately be
destroyed.
destroy_delta(d->next, true);
d->next = NULL;
@@ -4552,7 +4552,7 @@ tc_gc_idx( sql_store Store, sql_change *
return LOG_OK; /* cannot cleanup yet */
// d is oldest reachable delta
- if (d->next) // Unreachable can immediately be destroyed.
+ if (d->cs.merged && d->next) // Unreachable can immediately be
destroyed.
destroy_delta(d->next, true);
d->next = NULL;
@@ -4592,7 +4592,7 @@ tc_gc_upd_idx( sql_store Store, sql_chan
return LOG_OK; /* cannot cleanup yet */
// d is oldest reachable delta
- if (d->next) // Unreachable can immediately be destroyed.
+ if (d->cs.merged && d->next) // Unreachable can immediately be
destroyed.
destroy_delta(d->next, true);
d->next = NULL;
diff --git a/sql/test/Tests/regexp.test b/sql/test/Tests/regexp.test
--- a/sql/test/Tests/regexp.test
+++ b/sql/test/Tests/regexp.test
@@ -54,9 +54,36 @@ select regexp_replace('foo', 'f o o', 'X
----
foo
-# regex option - not extended
+# regex option - extended
query T rowsort
select regexp_replace('foo', 'f o o', 'XYZ', 'x')
----
XYZ
+# regex option - not emtpy match
+query T rowsort
+select regexp_replace('foobar', 'k?', 'XY')
+----
+foobar
+
+# regex option - emtpy match
+query T rowsort
+select regexp_replace('foobar', 'k?', '-', 'e')
+----
+-f-o-o-b-a-r-
+
+# regex option - empty match w alternative v1
+query T rowsort
+select regexp_replace('abc', 'b|k?', '-', 'e')
+----
+-a--c-
+
+# regex option - empty match w alternative v2
+# even though you would expect -a--c- the pcre lib does not return
+# the longest match for this particular pattern in offset 1 ('b') but
+# an empty string match ¯\_(ツ)_/¯
+query T rowsort
+select regexp_replace('abc', 'k?|b', '-', 'e')
+----
+-a-b-c-
+
diff --git
a/sql/test/concurrent/Tests/crash_on_concurrent_use.SF-1411926.SQL.py
b/sql/test/concurrent/Tests/crash_on_concurrent_use.SF-1411926.SQL.py
--- a/sql/test/concurrent/Tests/crash_on_concurrent_use.SF-1411926.SQL.py
+++ b/sql/test/concurrent/Tests/crash_on_concurrent_use.SF-1411926.SQL.py
@@ -1,7 +1,7 @@
import pymonetdb, sys, threading, os
query = '''
-select count(*) from tables;
+--select count(*) from tables;
create table t1(i int);
insert into t1 values(1);
insert into t1 values(2);
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]