Changeset: 311fe7824f18 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=311fe7824f18
Branch: Oct2020
Log Message:
merged
diffs (277 lines):
diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -9559,7 +9559,7 @@ optimize_rel(mvc *sql, sql_rel *rel, int
rel = rel_visitor_bottomup(&v, rel,
&rewrite_reset_used); /* reset used flag, used by rel_merge_select_rse */
}
- if (gp.cnt[op_project] && /* DISABLES CODE */ (0))
+ if (gp.cnt[op_project])
rel = rel_exp_visitor_bottomup(&v, rel, &rel_merge_project_rse,
false);
if (gp.cnt[op_join])
diff --git a/sql/test/SQLancer/Tests/sqlancer07.sql
b/sql/test/SQLancer/Tests/sqlancer07.sql
--- a/sql/test/SQLancer/Tests/sqlancer07.sql
+++ b/sql/test/SQLancer/Tests/sqlancer07.sql
@@ -113,3 +113,12 @@ select t0.c1 from t0 where (-5) in (case
select t0.c1 from t0 where (-5) in (case when t0.c1 then 1 else -2 end,
(select -3 from t0, t2 where false));
-- empty
ROLLBACK;
+
+START TRANSACTION;
+CREATE TABLE t1 (c0 DOUBLE PRECISION NOT NULL);
+INSERT INTO t1(c0)
VALUES((0.6548429615298178*0.3050008736497528)/(0.5061323979270875));
+INSERT INTO t1(c0) VALUES(((((COALESCE(0.6548429615298178,
0.20317629894456002))*(COALESCE(0.3050008736497528,
0.2277902039419617))))/(0.5061323979270875)));
+SELECT t1.c0 FROM t1;
+ -- 0.3946154725285108
+ -- 0.3946154725285108
+ROLLBACK;
diff --git a/tools/merovingian/daemon/CMakeLists.txt
b/tools/merovingian/daemon/CMakeLists.txt
--- a/tools/merovingian/daemon/CMakeLists.txt
+++ b/tools/merovingian/daemon/CMakeLists.txt
@@ -36,9 +36,7 @@ target_link_libraries(monetdbd
mcrypt
stream
mapi
- bat
msabaoth
- mal
${CMAKE_DL_LIBS}
Threads::Threads)
diff --git a/tools/merovingian/daemon/controlrunner.c
b/tools/merovingian/daemon/controlrunner.c
--- a/tools/merovingian/daemon/controlrunner.c
+++ b/tools/merovingian/daemon/controlrunner.c
@@ -34,9 +34,6 @@
#include "utils/database.h"
#include "utils/control.h"
-#include "gdk.h" /* these three for creation of dbs with password */
-#include "mal_authorize.h"
-
#include "merovingian.h"
#include "discoveryrunner.h" /* broadcast, remotedb */
#include "forkmserver.h"
@@ -442,78 +439,60 @@ static void ctl_handle_client(
} else {
if (*p != '\0') {
pid_t child;
- if ((child = fork()) == 0) {
- FILE *secretf;
- size_t len;
+ int pipes[2];
+ if (pipe(pipes) == -1) {
+ Mfprintf(_mero_ctlerr,
"%s: creating pipe failed\n",
+
origin);
+ } else if ((child = fork()) ==
0) {
+ /* this is the child
process; exit non-zero
+ * on failure */
char *err;
- char *vaultkey;
- opt *set =
malloc(sizeof(opt) * 2);
- int setlen = 0;
char *sadbfarm;
+ char buf3[8092];
+
+ close(pipes[1]);
+ dup2(pipes[0], 0);
+ close(pipes[0]);
if ((err =
msab_getDBfarm(&sadbfarm)) != NULL) {
-
Mfprintf(_mero_ctlerr, "%s: internal error: %s\n",
+
Mfprintf(_mero_ctlerr,
+
"%s: internal error: %s\n",
origin, err);
- exit(0);
- }
- snprintf(buf2,
sizeof(buf2), "%s/%s", sadbfarm, q);
- free(sadbfarm);
- setlen =
mo_add_option(&set, setlen, opt_cmdline, "gdk_dbpath", buf2);
- setlen =
mo_system_config(&set, setlen);
- if (BBPaddfarm(buf2, (1
<< PERSISTENT) | (1 << TRANSIENT), true) != GDK_SUCCEED) {
-
Mfprintf(_mero_ctlerr, "%s: could not add farm to "
- "'%s':
%d: %s\n", origin, q, errno, strerror(errno));
- exit(0);
- }
- /* the child, pollute
scope by loading BBP */
- if (chdir(q) < 0) {
- /* Fabian says
"Ignore the output.
- * The idea is
that the stuff below
- * will also
fail, and therefore emit
- * some error,
but if that happens,
- * the world
already is in such a bad
- * shape that
that most likely isn't
- * your biggest
problem.
- * Hence a
(void) probably does.
- * If not, a
fake if.
- * (exit(0)
should be fine)."
- *
(https://www.monetdb.org/pipermail/developers-list/2014-February/004238.html)
- */
-
Mfprintf(_mero_ctlerr, "%s: could not chdir to "
- "'%s':
%d: %s\n", origin, q, errno, strerror(errno));
- exit(0);
+
exit(EXIT_FAILURE);
}
-
- buf2[0] = '\0';
- if ((secretf =
fopen(".vaultkey", "r")) != NULL) {
- len =
fread(buf2, 1, sizeof(buf2), secretf);
- buf2[len] =
'\0';
- len =
strlen(buf2); /* secret can contain null-bytes */
- fclose(secretf);
- }
- if (GDKinit(set,
setlen, 0) != GDK_SUCCEED) {
-
Mfprintf(_mero_ctlerr, "%s: could not "
-
"initialize database '%s'\n",
+ snprintf(buf2,
sizeof(buf2),
+
"monet_vault_key=%s/%s/.vaultkey",
+
sadbfarm, q);
+ snprintf(buf3,
sizeof(buf3), "--dbpath=%s/%s",
+
sadbfarm, q);
+ free(sadbfarm);
+ execl(_mero_mserver,
+ _mero_mserver,
+ "--set",
+ buf2,
+ buf3,
+
"--read-password-initialize-and-exit",
+ NULL);
+ Mfprintf(_mero_ctlerr,
+ "%s:
cannot start mserver5\n", origin);
+ exit(EXIT_FAILURE);
+ } else if (child > 0) {
+ /* this is the parent
process */
+ int status;
+ close(pipes[0]);
+ write(pipes[1], p,
strlen(p));
+ write(pipes[1], "\n",
1);
+ close(pipes[1]);
+ /* wait for the child
to finish */
+ waitpid(child, &status,
0);
+ if (!WIFEXITED(status)
|| WEXITSTATUS(status) != 0)
+
Mfprintf(_mero_ctlerr,
+
"%s: initialization of database '%s' failed\n",
origin, q);
- exit(0);
- }
- vaultkey = buf2;
- if ((err =
AUTHunlockVault(vaultkey)) != NULL ||
- (err =
AUTHinitTables(p)) != NULL) {
-
Mfprintf(_mero_ctlerr, "%s: could not setup "
-
"database '%s': %s\n", origin, q, err);
-
freeException(err);
- } else {
- /* don't start
locked */
-
remove(".maintenance");
- }
-
- exit(0); /* return to
the parent */
- } else if (child > 0) {
- /* wait for the child
to finish */
- waitpid(child, NULL, 0);
} else {
- Mfprintf(_mero_ctlout,
"%s: forking failed\n",
+ close(pipes[0]);
+ close(pipes[1]);
+ Mfprintf(_mero_ctlerr,
"%s: forking failed\n",
origin);
}
}
diff --git a/tools/mserver/mserver5.1.in b/tools/mserver/mserver5.1.in
--- a/tools/mserver/mserver5.1.in
+++ b/tools/mserver/mserver5.1.in
@@ -202,6 +202,18 @@ Equivalent to \fB\-\-debug=\fP\fI(THRDMA
.TP
.B \-\-transactions
Equivalent to \fB\-\-debug=\fP\fI(TMMASK | DELTAMASK | TEMMASK)\fP.
+.TP
+.B \-\-read\-password\-initialize\-and\-exit
+Read an unencrypted password from standard input and use it to set the
+password for the
+.B monetdb
+administrator user, initialize the database, and exit.
+If the database was already initialized, the administrator password is
+not changed.
+This option is used by
+.IR monetdbd (1)
+when creating a new database with an administrator password and should
+not be used otherwise.
.SH MSERVER5 PARAMETERS
.I Mserver5
instructs the GDK kernel through the MAL (MonetDB Assembler Language)
diff --git a/tools/mserver/mserver5.c b/tools/mserver/mserver5.c
--- a/tools/mserver/mserver5.c
+++ b/tools/mserver/mserver5.c
@@ -270,6 +270,7 @@ main(int argc, char **av)
char *dbextra = NULL;
char *dbtrace = NULL;
bool inmemory = false;
+ bool readpwdxit = false;
static struct option long_options[] = {
{ "config", required_argument, NULL, 'c' },
{ "dbextra", required_argument, NULL, 0 },
@@ -294,6 +295,8 @@ main(int argc, char **av)
{ "threads", no_argument, NULL, 0 },
{ "transactions", no_argument, NULL, 0 },
+ { "read-password-initialize-and-exit", no_argument, NULL, 0 },
+
{ NULL, 0, NULL, 0 }
};
@@ -428,6 +431,10 @@ main(int argc, char **av)
grpdebug |= GRPtransactions;
break;
}
+ if (strcmp(long_options[option_index].name,
"read-password-initialize-and-exit") == 0) {
+ readpwdxit = true;
+ break;
+ }
usage(prog, -1);
/* not reached */
case 'c':
@@ -489,6 +496,11 @@ main(int argc, char **av)
exit(1);
}
+ if (inmemory && readpwdxit) {
+ fprintf(stderr, "!ERROR: cannot have both in-memory and
read-password-initialize-and-exit\n");
+ exit(1);
+ }
+
if (!dbpath) {
dbpath = absolute_path(mo_find_option(set, setlen,
"gdk_dbpath"));
if (!dbpath) {
@@ -689,7 +701,7 @@ main(int argc, char **av)
}
fclose(secretf);
}
- if ((err = AUTHunlockVault(secretp)) != MAL_SUCCEED) {
+ if ((err = AUTHunlockVault(secret)) != MAL_SUCCEED) {
/* don't show this as a crash */
if (!GDKinmemory())
msab_registerStop();
@@ -697,6 +709,23 @@ main(int argc, char **av)
freeException(err);
exit(1);
}
+ if (readpwdxit) {
+ if (fgets(secret, (int) sizeof(secret), stdin) == NULL)
{
+ fprintf(stderr, "!ERROR: no password read\n");
+ exit(1);
+ }
+ if ((secretp = strchr(secret, '\n')) == NULL) {
+ fprintf(stderr, "!ERROR: password too long\n");
+ exit(1);
+ }
+ *secretp = '\0';
+ if ((err = AUTHinitTables(secret)) != MAL_SUCCEED) {
+ fprintf(stderr, "%s\n", err);
+ freeException(err);
+ exit(1);
+ }
+ exit(0);
+ }
}
char *modules[16];
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list