Changeset: faa1a339a3e0 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=faa1a339a3e0 Added Files: sql/test/Triggers/Tests/trigger_projection.sql.src sql/test/Triggers/Tests/trigger_projection.stable.err sql/test/Triggers/Tests/trigger_projection.stable.out sql/test/Triggers/trigger_projection.sql Removed Files: sql/test/miscellaneous/Tests/trigger_projection.sql sql/test/miscellaneous/Tests/trigger_projection.stable.err sql/test/miscellaneous/Tests/trigger_projection.stable.out Modified Files: monetdb5/extras/rapi/rapi.c sql/backends/monet5/sql_scenario.c sql/backends/monet5/sql_user.c sql/test/Triggers/Tests/All sql/test/Triggers/run.all sql/test/Users/Tests/createUserRollback.SQL.py sql/test/Users/Tests/createUserRollback.stable.err sql/test/Users/Tests/createUserRollback.stable.out sql/test/miscellaneous/Tests/All testing/Mtest.py.in Branch: default Log Message:
Merge with Jun2020 branch. diffs (297 lines): diff --git a/monetdb5/extras/rapi/rapi.c b/monetdb5/extras/rapi/rapi.c --- a/monetdb5/extras/rapi/rapi.c +++ b/monetdb5/extras/rapi/rapi.c @@ -30,6 +30,7 @@ #define USE_RINTERNALS 1 +#include <Rversion.h> #include <Rembedded.h> #include <Rdefines.h> #include <Rinternals.h> @@ -110,25 +111,34 @@ static char *RAPIinitialize(void) { // set some command line arguments { structRstart rp; - Rstart Rp = &rp; - char *rargv[] = { "R", "--slave", "--vanilla" }; + char *rargv[] = { "R", +#if R_VERSION >= R_Version(4,0,0) + "--no-echo", +#else + "--slave", +#endif + "--vanilla" }; int stat = 0; - R_DefParams(Rp); - Rp->R_Slave = (Rboolean) TRUE; - Rp->R_Quiet = (Rboolean) TRUE; - Rp->R_Interactive = (Rboolean) FALSE; - Rp->R_Verbose = (Rboolean) FALSE; - Rp->LoadSiteFile = (Rboolean) FALSE; - Rp->LoadInitFile = (Rboolean) FALSE; - Rp->RestoreAction = SA_NORESTORE; - Rp->SaveAction = SA_NOSAVE; - Rp->NoRenviron = TRUE; + R_DefParams(&rp); +#if R_VERSION >= R_Version(4,0,0) + rp.R_NoEcho = (Rboolean) TRUE; +#else + rp.R_Slave = (Rboolean) TRUE; +#endif + rp.R_Quiet = (Rboolean) TRUE; + rp.R_Interactive = (Rboolean) FALSE; + rp.R_Verbose = (Rboolean) FALSE; + rp.LoadSiteFile = (Rboolean) FALSE; + rp.LoadInitFile = (Rboolean) FALSE; + rp.RestoreAction = SA_NORESTORE; + rp.SaveAction = SA_NOSAVE; + rp.NoRenviron = TRUE; stat = Rf_initialize_R(2, rargv); if (stat < 0) { return "Rf_initialize failed"; } - R_SetParams(Rp); + R_SetParams(&rp); } /* disable stack checking, because threads will throw it off */ diff --git a/sql/backends/monet5/sql_scenario.c b/sql/backends/monet5/sql_scenario.c --- a/sql/backends/monet5/sql_scenario.c +++ b/sql/backends/monet5/sql_scenario.c @@ -262,25 +262,27 @@ SQLgetquery(Client c) static char* SQLprepareClient(Client c, int login) { - mvc *m; - str schema; - backend *be; + mvc *m = NULL; + backend *be = NULL; + str msg = MAL_SUCCEED; c->getquery = SQLgetquery; if (c->sqlcontext == 0) { m = mvc_create(c->idx, 0, SQLdebug, c->fdin, c->fdout); - if (m == NULL) - throw(SQL,"sql.initClient",SQLSTATE(HY013) MAL_MALLOC_FAIL); + if (m == NULL) { + msg = createException(SQL,"sql.initClient", SQLSTATE(HY013) MAL_MALLOC_FAIL); + goto bailout; + } if (global_variables(m, "monetdb", "sys") < 0) { - mvc_destroy(m); - throw(SQL,"sql.initClient",SQLSTATE(HY013) MAL_MALLOC_FAIL); + msg = createException(SQL,"sql.initClient", SQLSTATE(HY013) MAL_MALLOC_FAIL); + goto bailout; } if (c->scenario && strcmp(c->scenario, "msql") == 0) m->reply_size = -1; be = (void *) backend_create(m, c); if ( be == NULL) { - mvc_destroy(m); - throw(SQL,"sql.initClient", SQLSTATE(HY013) MAL_MALLOC_FAIL); + msg = createException(SQL,"sql.initClient", SQLSTATE(HY013) MAL_MALLOC_FAIL); + goto bailout; } } else { be = c->sqlcontext; @@ -290,21 +292,24 @@ SQLprepareClient(Client c, int login) */ if (m->session->tr->active) return NULL; - if (mvc_reset(m, c->fdin, c->fdout, SQLdebug) < 0) - throw(SQL,"sql.initClient", SQLSTATE(HY013) MAL_MALLOC_FAIL); + if (mvc_reset(m, c->fdin, c->fdout, SQLdebug) < 0) { + msg = createException(SQL,"sql.initClient", SQLSTATE(HY013) MAL_MALLOC_FAIL); + goto bailout; + } backend_reset(be); } if (m->session->tr) reset_functions(m->session->tr); if (login) { - schema = monet5_user_set_def_schema(m, c->user); + str schema = monet5_user_set_def_schema(m, c->user); if (!schema) { - _DELETE(schema); - throw(PERMD, "SQLinitClient", SQLSTATE(08004) "schema authorization error"); + msg = createException(PERMD,"sql.initClient", SQLSTATE(08004) "Schema authorization error"); + goto bailout; } _DELETE(schema); } +bailout: /*expect SQL text first */ be->language = 'S'; /* Set state, this indicates an initialized client scenario */ @@ -312,7 +317,9 @@ SQLprepareClient(Client c, int login) c->state[MAL_SCENARIO_PARSER] = c; c->state[MAL_SCENARIO_OPTIMIZE] = c; c->sqlcontext = be; - return NULL; + if (msg) + c->mode = FINISHCLIENT; + return msg; } str diff --git a/sql/backends/monet5/sql_user.c b/sql/backends/monet5/sql_user.c --- a/sql/backends/monet5/sql_user.c +++ b/sql/backends/monet5/sql_user.c @@ -454,8 +454,9 @@ monet5_user_get_def_schema(mvc *m, int u auths_id = find_sql_column(auths, "id"); auths_name = find_sql_column(auths, "name"); rid = table_funcs.column_find_row(m->session->tr, auths_id, &user, NULL); - if (!is_oid_nil(rid)) - username = table_funcs.column_find_value(m->session->tr, auths_name, rid); + if (is_oid_nil(rid)) + return NULL; + username = table_funcs.column_find_value(m->session->tr, auths_name, rid); user_info = find_sql_table(sys, "db_user_info"); users_name = find_sql_column(user_info, "name"); @@ -521,8 +522,9 @@ monet5_user_set_def_schema(mvc *m, oid u users_schema = find_sql_column(user_info, "default_schema"); rid = table_funcs.column_find_row(m->session->tr, users_name, username, NULL); - if (!is_oid_nil(rid)) - p = table_funcs.column_find_value(m->session->tr, users_schema, rid); + if (is_oid_nil(rid)) + return NULL; + p = table_funcs.column_find_value(m->session->tr, users_schema, rid); assert(p); schema_id = *(sqlid *) p; diff --git a/sql/test/Triggers/Tests/All b/sql/test/Triggers/Tests/All --- a/sql/test/Triggers/Tests/All +++ b/sql/test/Triggers/Tests/All @@ -7,3 +7,4 @@ trigger_activation trigger_owner triggers_schema_operations trigger_insert +KNOWNFAIL?trigger_projection diff --git a/sql/test/Triggers/Tests/trigger_projection.sql.src b/sql/test/Triggers/Tests/trigger_projection.sql.src new file mode 100644 --- /dev/null +++ b/sql/test/Triggers/Tests/trigger_projection.sql.src @@ -0,0 +1,1 @@ +$RELSRCDIR/../trigger_projection.sql diff --git a/sql/test/miscellaneous/Tests/trigger_projection.stable.err b/sql/test/Triggers/Tests/trigger_projection.stable.err rename from sql/test/miscellaneous/Tests/trigger_projection.stable.err rename to sql/test/Triggers/Tests/trigger_projection.stable.err diff --git a/sql/test/miscellaneous/Tests/trigger_projection.stable.out b/sql/test/Triggers/Tests/trigger_projection.stable.out rename from sql/test/miscellaneous/Tests/trigger_projection.stable.out rename to sql/test/Triggers/Tests/trigger_projection.stable.out diff --git a/sql/test/Triggers/run.all b/sql/test/Triggers/run.all --- a/sql/test/Triggers/run.all +++ b/sql/test/Triggers/run.all @@ -52,4 +52,6 @@ echo trigger owner $SQL < trigger_owner_drop.sql echo done - +echo trigger projection +$SQL < trigger_projection.sql +echo done diff --git a/sql/test/miscellaneous/Tests/trigger_projection.sql b/sql/test/Triggers/trigger_projection.sql rename from sql/test/miscellaneous/Tests/trigger_projection.sql rename to sql/test/Triggers/trigger_projection.sql diff --git a/sql/test/Users/Tests/createUserRollback.SQL.py b/sql/test/Users/Tests/createUserRollback.SQL.py --- a/sql/test/Users/Tests/createUserRollback.SQL.py +++ b/sql/test/Users/Tests/createUserRollback.SQL.py @@ -13,7 +13,7 @@ with process.client('sql', stdin=process CREATE USER "1" WITH PASSWORD '1' NAME '1' SCHEMA "sys"; ROLLBACK; - SELECT CAST(COUNT(*) - (SELECT c FROM sys.myvar) AS BIGINT) FROM sys.users; --the total count, cannot change + SELECT CAST(COUNT(*) - (SELECT c FROM sys.myvar) AS BIGINT) FROM sys.users; -- The MAL authorization is not transaction aware, so the count changes :/ DROP TABLE sys.myvar; ''') sys.stdout.write(out) diff --git a/sql/test/Users/Tests/createUserRollback.stable.err b/sql/test/Users/Tests/createUserRollback.stable.err --- a/sql/test/Users/Tests/createUserRollback.stable.err +++ b/sql/test/Users/Tests/createUserRollback.stable.err @@ -5,6 +5,7 @@ stderr of test 'createUserRollback` in d # 12:24:01 > "/usr/bin/python3" "createUserRollback.SQL.py" "createUserRollback" # 12:24:01 > +Schema authorization error # 12:24:01 > # 12:24:01 > "Done." diff --git a/sql/test/Users/Tests/createUserRollback.stable.out b/sql/test/Users/Tests/createUserRollback.stable.out --- a/sql/test/Users/Tests/createUserRollback.stable.out +++ b/sql/test/Users/Tests/createUserRollback.stable.out @@ -16,7 +16,7 @@ stdout of test 'createUserRollback` in d % %7 # name % bigint # type % 1 # length -[ 0 ] +[ 1 ] #DROP TABLE sys.myvar; # 12:24:01 > diff --git a/sql/test/miscellaneous/Tests/All b/sql/test/miscellaneous/Tests/All --- a/sql/test/miscellaneous/Tests/All +++ b/sql/test/miscellaneous/Tests/All @@ -16,4 +16,3 @@ deallocate table_udf_missing_var create_func_temp simple_plans -trigger_projection diff --git a/testing/Mtest.py.in b/testing/Mtest.py.in --- a/testing/Mtest.py.in +++ b/testing/Mtest.py.in @@ -3657,8 +3657,29 @@ def main(argv) : dft['MALCLIENT'] = "'mclient -lmal -ftest -tnone -Eutf-8'" dft['SQLCLIENT'] = "'mclient -lsql -ftest -tnone -Eutf-8'" dft['SQLDUMP'] = "'msqldump -q'" - dft['RCLIENT'] = "'R --vanilla --slave'" - dft['RUBYCLIENT'] = "'ruby'" + dft['RUBYCLIENT'] = "'ruby'" + + r_noecho = '--no-echo' + if CheckExec('R'): + proc = process.Popen(['R', '--version'], + stdout = process.PIPE, stderr = process.PIPE, + universal_newlines = True) + r_out, r_err = proc.communicate() + res = re.search(r'R version (?P<major>\d+)\.', r_out) + if res is not None and int(res.group('major')) < 4: + r_noecho = '--slave' + if CONDITIONALS['HAVE_LIBR']: + proc = process.Popen(['R', r_noecho, '--no-save', '--no-restore', + '-e', 'print(Sys.getenv("R_LIBS_USER"))'], + stdout = process.PIPE, stderr = process.PIPE, + universal_newlines = True) + r_out, r_err = proc.communicate() + res = re.search(r'\[\d+\] "(?P<dir>.*)"', r_out) + if res is not None: + rdir = os.path.expanduser(res.group('dir')) + if not os.path.exists(rdir): + os.makedirs(rdir) + dft['RCLIENT'] = "'R --vanilla {}'".format(r_noecho) #par = {} # get current environment @@ -3883,17 +3904,6 @@ def main(argv) : CONDITIONALS['HAVE_PERL'] = '#' else: print('Perl available, but MonetDB driver or DBI module not available') - if CONDITIONALS['HAVE_LIBR'] and CheckExec('R'): - proc = process.Popen(['R', '--slave', '--no-save', '--no-restore', - '-e', 'print(Sys.getenv("R_LIBS_USER"))'], - stdout = process.PIPE, stderr = process.PIPE, - universal_newlines = True) - r_out, r_err = proc.communicate() - res = re.search(r'\[\d+\] "(?P<dir>.*)"', r_out) - if res is not None: - rdir = os.path.expanduser(res.group('dir')) - if not os.path.exists(rdir): - os.makedirs(rdir) if CheckExec('php'): phpcmd = ['php'] if 'PHP_INCPATH' in os.environ: _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list