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 -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org