Changeset: 9ef27526d702 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/9ef27526d702 Modified Files: sql/backends/monet5/sql.c sql/backends/monet5/sql_upgrades.c sql/scripts/49_strings.sql Branch: odbc_loader Log Message:
Add upgrade code to normalize the URLs of existing remote tables Create sys.normalize_monetdb_url(url string) to do so diffs (103 lines): 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 @@ -31,6 +31,7 @@ #include "rel_exp.h" #include "rel_dump.h" #include "rel_physical.h" +#include "rel_remote.h" #include "mal.h" #include "mal_client.h" #include "mal_interpreter.h" @@ -5584,6 +5585,44 @@ bailout: throw(SQL, "SQLread_dump_rel", SQLSTATE(HY013) MAL_MALLOC_FAIL); } +static str +SQLnormalize_monetdb_url(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) +{ + (void)mb; + str *ret = getArgReference_str(stk, pci, 0); + str url = *getArgReference_str(stk, pci, 1); + allocator *sa; + backend *be = NULL; + str msg; + msettings_error err; + str normalized; + + if (strNil(url)) + throw(MAL, "SQLnormalize_monetdb_url", SQLSTATE(42000) "url cannot be nil"); + + if ((msg = getBackendContext(cntxt, &be)) != NULL) + return msg; + sa = be->mvc->sa; + + msettings *mp = sa_msettings_create(sa); + if (mp == NULL) + throw(SQL, "SQLnormalize_monetdb_url", SQLSTATE(HY013) MAL_MALLOC_FAIL); + + err = msettings_parse_url(mp, url); + if (err != NULL) + throw(SQL, "SQLnormalize_monetdb_url", SQLSTATE(42000) "Invalid URL: %s", err); + + normalized = sa_msettings_to_string(mp, sa, strlen(url)); + if (normalized == NULL) + throw(SQL, "SQLnormalize_monetdb_url", SQLSTATE(HY013) MAL_MALLOC_FAIL); + + *ret = _STRDUP(normalized); + + return MAL_SUCCEED; +} + + + static mel_func sql_init_funcs[] = { pattern("sql", "shutdown", SQLshutdown_wrap, true, "", args(1,3, arg("",str),arg("delay",bte),arg("force",bit))), @@ -6518,6 +6557,7 @@ static mel_func sql_init_funcs[] = { pattern("sql", "stop_vacuum", SQLstr_stop_vacuum, true, "stop auto vacuum", args(0,2, arg("sname",str),arg("tname",str))), pattern("sql", "check", SQLcheck, false, "Return sql string of check constraint.", args(1,3, arg("sql",str), arg("sname", str), arg("name", str))), pattern("sql", "read_dump_rel", SQLread_dump_rel, false, "Reads sql_rel string into sql_rel object and then writes it to the return value", args(1,2, arg("sql",str), arg("sql_rel", str))), + pattern("sql", "normalize_monetdb_url", SQLnormalize_monetdb_url, false, "Normalize mapi:monetdb://, monetdb:// or monetdbs:// URL", args(1,2, arg("",str),arg("u",str))), { .imp=NULL } }; #include "mal_import.h" diff --git a/sql/backends/monet5/sql_upgrades.c b/sql/backends/monet5/sql_upgrades.c --- a/sql/backends/monet5/sql_upgrades.c +++ b/sql/backends/monet5/sql_upgrades.c @@ -4735,6 +4735,23 @@ sql_update_default(Client c, mvc *sql, s return err; } + sql_find_subtype(&tp, "varchar", 0, 0); + if (!sql_bind_func(sql, s->base.name, "normalize_monetdb_url", &tp, NULL, F_FUNC, true, true)) { + sql->session->status = 0; /* if the function was not found clean the error */ + sql->errstr[0] = '\0'; + const char query[] = + "create function sys.normalize_monetdb_url(u string)\n" + "returns string external name sql.normalize_monetdb_url;\n" + "grant execute on function sys.normalize_monetdb_url(string) to public;\n" + "update sys.functions set system = true where system <> true and name = 'normalize_monetdb_url' and schema_id = 2000;\n" + "update sys._tables set query = sys.normalize_monetdb_url(query) where type in (5,6);"; + printf("Running database upgrade commands:\n%s\n", query); + fflush(stdout); + err = SQLstatementIntern(c, query, "update", true, false, NULL); + if (err) + return err; + } + return err; } diff --git a/sql/scripts/49_strings.sql b/sql/scripts/49_strings.sql --- a/sql/scripts/49_strings.sql +++ b/sql/scripts/49_strings.sql @@ -66,3 +66,8 @@ GRANT EXECUTE ON AGGREGATE sys.group_con create aggregate sys.group_concat(str string, sep string) returns string with order external name "aggr"."str_group_concat"; GRANT EXECUTE ON AGGREGATE sys.group_concat(string, string) TO PUBLIC; + +create function sys.normalize_monetdb_url(u string) +returns string external name sql.normalize_monetdb_url; +grant execute on function sys.normalize_monetdb_url(string) to public; + _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org