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

Reply via email to