Changeset: 1752fd07b4da for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/1752fd07b4da
Modified Files:
sql/backends/monet5/Tests/insertonly_persist.SQL.py
sql/backends/monet5/sql.c
sql/scripts/77_storage.sql
Branch: insertonly
Log Message:
Overload insertonly_persist with a call with no args, defaulting to current
schema.
diffs (129 lines):
diff --git a/sql/backends/monet5/Tests/insertonly_persist.SQL.py
b/sql/backends/monet5/Tests/insertonly_persist.SQL.py
--- a/sql/backends/monet5/Tests/insertonly_persist.SQL.py
+++ b/sql/backends/monet5/Tests/insertonly_persist.SQL.py
@@ -11,28 +11,25 @@ with tempfile.TemporaryDirectory() as fa
with process.server(mapiport='0', dbname='db1',
dbfarm=os.path.join(farm_dir, 'db1'),
- args=["--set", "insertonly_nowal=true", "--set",
"embedded_py=true"],
+ args=["--set", "insertonly_nowal=true"],
stdin=process.PIPE,
stdout=process.PIPE, stderr=process.PIPE) as s:
- print(os.path.join(farm_dir, 'db1'))
with SQLTestCase() as tc:
tc.connect(username="monetdb", password="monetdb", port=s.dbport,
database='db1')
tc.execute("CREATE OR REPLACE FUNCTION sleep(msecs int) RETURNS
INT EXTERNAL NAME alarm.sleep")
tc.execute("CREATE TABLE foo (x INT)").assertSucceeded()
tc.execute("ALTER TABLE foo SET INSERT ONLY").assertSucceeded()
- tc.execute("CREATE LOADER up() LANGUAGE PYTHON { _emit.emit({'x':
list(range(1,101))}) }").assertSucceeded()
- tc.execute("COPY LOADER INTO foo FROM up()").assertSucceeded()
- tc.execute("SELECT count(*) FROM
foo").assertSucceeded().assertDataResultMatch([(100,)])
- tc.execute("SELECT sleep(5000)")
- tc.execute("SELECT * FROM
insertonly_persist('sys')").assertSucceeded().assertDataResultMatch([('foo',
7891, 100)])
+ tc.execute("INSERT INTO foo SELECT * FROM generate_series(0,500)")
+ tc.execute("SELECT count(*) FROM
foo").assertSucceeded().assertDataResultMatch([(500,)])
+ tc.execute("SELECT sleep(2000)")
+ tc.execute("SELECT * FROM
insertonly_persist('sys')").assertSucceeded().assertDataResultMatch([('foo',
7891, 500)])
s.communicate()
with process.server(mapiport='0', dbname='db1',
dbfarm=os.path.join(farm_dir, 'db1'),
stdin=process.PIPE,
stdout=process.PIPE, stderr=process.PIPE) as s:
- print(os.path.join(farm_dir, 'db1'))
with SQLTestCase() as tc:
tc.connect(username="monetdb", password="monetdb", port=s.dbport,
database='db1')
- tc.execute("SELECT COUNT(*) FROM
foo").assertSucceeded().assertDataResultMatch([(100,)])
+ tc.execute("SELECT COUNT(*) FROM
foo").assertSucceeded().assertDataResultMatch([(500,)])
s.communicate()
diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -4327,14 +4327,13 @@ SQLinsertonly_persist(Client cntxt, MalB
(void)stk;
(void)pci;
- bool schema_wide = pci->argc == 4 ? true : false;
- assert(pci->argc == 4 || pci->argc == 5);
+ bool schema_wide = pci->argc == 3 || pci->argc == 4 ? true : false;
bat *o0 = getArgReference_bat(stk, pci, 0),
*o1 = getArgReference_bat(stk, pci, 1),
*o2 = getArgReference_bat(stk, pci, 2);
- str i1 = *getArgReference_str(stk, pci, 3);
+ str i1 = schema_wide && pci->argc == 4 ? *getArgReference_str(stk, pci,
3) : NULL;
str i2 = !schema_wide ? *getArgReference_str(stk, pci, 4) : NULL;
str msg = MAL_SUCCEED;
@@ -4358,11 +4357,18 @@ SQLinsertonly_persist(Client cntxt, MalB
throw(SQL, "sql.insertonly_persist", "Function cannot be used
without setting"
" insertonly_nowal flag at server startup.");
- sql_schema *s = mvc_bind_schema(m, i1);
- if (!s)
- throw(SQL, "sql.insertonly_persist", SQLSTATE(3F000) "Schema
missing %s.", i1);
-
- if (!mvc_schema_privs(m, s))
+ sql_schema *s = NULL;
+ if (i1) {
+ s = mvc_bind_schema(m, i1);
+ if (s == NULL)
+ throw(SQL, "sql.insertonly_persist", SQLSTATE(3F000)
"Schema missing %s.", i1);
+ } else {
+ s = m->session->schema;
+ /* throw(SQL, "sql.insertonly_persist", SQLSTATE(3F000) "Schema
missing %s.", i1); */
+ }
+
+
+ if (pci->argc != 3 && !mvc_schema_privs(m, s))
throw(SQL, "sql.insertonly_persist", SQLSTATE(42000) "Access
denied for %s to schema '%s'.",
get_string_global_var(m, "current_user"),
s->base.name);
@@ -4408,9 +4414,6 @@ SQLinsertonly_persist(Client cntxt, MalB
sql_column *c = (sql_column *)
ncol->data;
bs =
store->storage_api.bind_col(tr, c, RDONLY);
- if (bs && isVIEW(bs))
- bs =
BATdescriptor(VIEWtparent(bs));
-
if (bs == NULL) {
MT_lock_unset(&store->commit);
GDKfree(commit_list);
@@ -4419,6 +4422,9 @@ SQLinsertonly_persist(Client cntxt, MalB
throw(SQL,
"sql.insertonly_persist", "Cannot access column descriptor.");
}
+ if (isVIEW(bs))
+ bs =
BATdescriptor(VIEWtparent(bs));
+
if (i == n && ncol->next) {
n = n * 2;
commit_list =
GDKrealloc(commit_list, sizeof(bat) * n);
@@ -5228,6 +5234,7 @@ static mel_func sql_init_funcs[] = {
pattern("sql", "resume_log_flushing", SQLresume_log_flushing, true, "Resume
WAL log flushing", args(1,1, arg("",void))),
pattern("sql", "suspend_log_flushing", SQLsuspend_log_flushing, true,
"Suspend WAL log flushing", args(1,1, arg("",void))),
pattern("sql", "hot_snapshot", SQLhot_snapshot, true, "Write db snapshot to
the given tar(.gz/.lz4/.bz/.xz) file on either server or client", args(1,3,
arg("",void),arg("tarfile", str),arg("onserver",bit))),
+ pattern("sql", "insertonly_persist", SQLinsertonly_persist, true, "Persist
deltas on append only tables in current schema.", args(3, 3, batarg("table",
str), batarg("table_id", lng), batarg("rowcount", lng))),
pattern("sql", "insertonly_persist", SQLinsertonly_persist, true, "Persist
deltas on append only tables in schema s.", args(3, 4, batarg("table", str),
batarg("table_id", lng), batarg("rowcount", lng), arg("s", str))),
pattern("sql", "insertonly_persist", SQLinsertonly_persist, true, "Persist
deltas on append only table in schema s table t.", args(3, 5, batarg("table",
str), batarg("table_id", lng), batarg("rowcount", lng), arg("s", str), arg("t",
str))),
pattern("sql", "assert", SQLassert, false, "Generate an exception when
b==true", args(1,3, arg("",void),arg("b",bit),arg("msg",str))),
diff --git a/sql/scripts/77_storage.sql b/sql/scripts/77_storage.sql
--- a/sql/scripts/77_storage.sql
+++ b/sql/scripts/77_storage.sql
@@ -6,6 +6,15 @@
--
-- Copyright 1997 - July 2008 CWI, August 2008 - 2023 MonetDB B.V.
+create function sys.insertonly_persist()
+returns table(
+ "table" string,
+ "table_id" bigint,
+ "rowcount" bigint
+)
+external name sql.insertonly_persist;
+grant execute on function sys.insertonly_persist() to public;
+
create function sys.insertonly_persist(sname string)
returns table(
"table" string,
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]