Changeset: f0a4b63011ab for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f0a4b63011ab
Modified Files:
monetdb5/modules/mal/pcre.c
monetdb5/modules/mal/tablet.mx
sql/backends/monet5/sql.mx
sql/backends/monet5/sql_result.mx
sql/server/rel_bin.c
sql/server/rel_optimizer.c
sql/server/rel_select.c
sql/server/rel_select.h
sql/server/sql_statement.c
sql/server/sql_statement.h
sql/test/Dependencies/Tests/Dependencies.stable.out
Branch: default
Log Message:
Merge with Aug2011 branch.
diffs (truncated from 1134 to 300 lines):
diff --git a/NT/Makefile b/NT/Makefile
--- a/NT/Makefile
+++ b/NT/Makefile
@@ -22,9 +22,12 @@ srcdir = $(TOPDIR)\..
prefix = $(MAKEDIR)
+# ensure "all" is first target
+all: _all
+
!INCLUDE "$(TOPDIR)\..\NT\rules.msc"
-all: update_winconfig_conds_py "$(srcdir)\Makefile.msc" monetdb_config.h
unistd.h inttypes.h .monetdb
+_all: update_winconfig_conds_py "$(srcdir)\Makefile.msc" monetdb_config.h
unistd.h inttypes.h .monetdb
$(MAKE) /nologo /f "$(srcdir)\Makefile.msc" "prefix=$(prefix)"
"bits=$(bits)" all
install: targetdirs all
diff --git a/gdk/gdk_bbp.mx b/gdk/gdk_bbp.mx
--- a/gdk/gdk_bbp.mx
+++ b/gdk/gdk_bbp.mx
@@ -507,7 +507,18 @@ static int BBPdiskscan(const char *);
* conversion are fatal. This function is "safe" in the sense that
* when it is interrupted, recovery will just start over. No
* permanent changes are made to the database until all string heaps
- * have been converted, and then the changes are made atomically. */
+ * have been converted, and then the changes are made atomically.
+ *
+ * In addition to doing the conversion to all BATs with OID or STR
+ * columns (the latter since the format of the string heap is
+ * different for 64/32 and 64/64 configurations), we also look out for
+ * the *_catalog BATs that are used by gdk_logger. If we encounter
+ * such a BAT, we create a file based on the name of that BAT
+ * (i.e. using the first part of the name) to inform the logger that
+ * it too needs to convert 32 bit OIDs to 64 bits. If the process
+ * here gets interrupted, the logger is never called, and if we get
+ * then restarted, we just create the file again, so this process is
+ * safe. */
static void
fixoidheapcolumn(BAT *b, const char *nme, const char *filename,
@@ -650,6 +661,7 @@ fixoidheap(void)
long_str filename;
int ht, tt;
char hs, hvs = '\0', ts, tvs = '\0'; /* saved storage types */
+ size_t len;
fprintf(stderr,
"# upgrading database from 32 bit OIDs to 64 bit OIDs\n");
@@ -658,6 +670,20 @@ fixoidheap(void)
for (bid = 1; bid < BBPsize; bid++) {
if ((bs = BBP[bid].cache) == NULL)
continue; /* not a valid BAT */
+ if (BBP[bid].nme[0] &&
+ (len = strlen(BBP[bid].nme[0])) > 8 &&
+ strcmp(BBP[bid].nme[0] + len - 8, "_catalog") == 0) {
+ /* this is one of the files used by the
+ * logger. We need to communicate to the
+ * logger that it also needs to do a
+ * conversion. That is done by creating a
+ * file here based on the name of this BAT. */
+ snprintf(filename, sizeof(filename),
+ "%.*s_32-64-convert",
+ (int) (len - 8), BBP[bid].nme[0]);
+ fclose(fopen(filename, "w"));
+ }
+
/* OID and (non-void) varsized columns have to be rewritten */
if (bs->H.type != TYPE_oid &&
(bs->H.type == TYPE_void || !bs->H.varsized) &&
diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -299,6 +299,10 @@ log_read_updates(logger *lg, trans *tr,
void *(*rt) (ptr, stream *, size_t) = BATatoms[tt].atomRead;
void *tv = ATOMnil(tt);
+#if SIZEOF_OID == 8
+ if (tt == TYPE_oid && lg->read32bitoid)
+ rt = BATatoms[TYPE_int].atomRead;
+#endif
r = BATnew(ht, tt, l->nr);
if (hseq)
@@ -314,8 +318,18 @@ log_read_updates(logger *lg, trans *tr,
res = LOG_ERR;
break;
}
- if (l->flag == LOG_INSERT)
+ if (l->flag == LOG_INSERT) {
+#if SIZEOF_OID == 8
+ if (tt == TYPE_oid && lg->read32bitoid)
{
+ int vi = * (int *) t;
+ if (vi == int_nil)
+ * (oid *) t = oid_nil;
+ else
+ * (oid *) t = vi;
+ }
+#endif
BUNappend(r, t, TRUE);
+ }
if (t != tv)
GDKfree(t);
}
@@ -323,6 +337,11 @@ log_read_updates(logger *lg, trans *tr,
void *(*rh) (ptr, stream *, size_t) = ht == TYPE_void ?
BATatoms[TYPE_oid].atomRead : BATatoms[ht].atomRead;
void *hv = ATOMnil(ht);
+#if SIZEOF_OID == 8
+ if ((ht == TYPE_oid || ht == TYPE_void) &&
+ lg->read32bitoid)
+ rh = BATatoms[TYPE_int].atomRead;
+#endif
for (; l->nr > 0; l->nr--) {
void *h = rh(hv, lg->log, 1);
void *t = rt(tv, lg->log, 1);
@@ -331,6 +350,24 @@ log_read_updates(logger *lg, trans *tr,
res = LOG_ERR;
break;
}
+#if SIZEOF_OID == 8
+ if (lg->read32bitoid) {
+ if (ht == TYPE_void || ht == TYPE_oid) {
+ int vi = * (int *) h;
+ if (vi == int_nil)
+ * (oid *) h = oid_nil;
+ else
+ * (oid *) h = vi;
+ }
+ if (tt == TYPE_oid) {
+ int vi = * (int *) t;
+ if (vi == int_nil)
+ * (oid *) t = oid_nil;
+ else
+ * (oid *) t = vi;
+ }
+ }
+#endif
BUNins(r, h, t, TRUE);
if (h != hv)
GDKfree(h);
@@ -968,6 +1005,9 @@ logger_new(int debug, char *fn, char *lo
lg->id = 1;
lg->tid = 0;
+#if SIZEOF_OID == 8
+ lg->read32bitoid = 0;
+#endif
/* if the path is absolute, it means someone is still calling
* logger_create/logger_new "manually" */
@@ -1107,14 +1147,109 @@ logger_new(int debug, char *fn, char *lo
BBPrename(lg->freed->batCacheid, bak);
if (fp != NULL) {
+#if SIZEOF_OID == 8
+ char cvfile[BUFSIZ];
+#endif
+
if (check_version(lg, fp)) {
goto error;
}
+#if SIZEOF_OID == 8
+ /* When a file *_32-64-convert exists in the dbfarm,
+ * it was left there by the BBP initialization code
+ * when it did a conversion of 32-bit OIDs to 64 bits
+ * (see the comment above fixoidheapcolumn and
+ * fixoidheap in gdk_bbp). It the file exists, we
+ * first create a file called convert-32-64 in the log
+ * directory and we write the current log ID into that
+ * file. After this file is created, we delete the
+ * *_32-64-convert file in the dbfarm. We then know
+ * that while reading the logs, we have to read OID
+ * values as 32 bits (this is indicated by setting the
+ * read32bitoid flag). When we're done reading the
+ * logs, we remove the file (and reset the flag). If
+ * we get interrupted before we have written this
+ * file, the file in the dbfarm will still exist, so
+ * the next time we're started, BBPinit will not
+ * convert OIDs (that was done before we got
+ * interrupted), but we will still know to convert the
+ * OIDs ourselves. If we get interrupted after we
+ * have deleted the file from the dbfarm, we check
+ * whether the file convert-32-64 exists and if it
+ * contains the expected ID. If it does, we again
+ * know that we have to convert. If the ID is not
+ * what we expect, the conversion was apparently done
+ * already, and so we can delete the file. */
+
+ snprintf(cvfile, sizeof(cvfile),
+ "%s%c%s%c%s%c%s%cconvert-32-64",
+ GDKgetenv("gdk_dbfarm"), DIR_SEP, dbname,
+ DIR_SEP, logdir, DIR_SEP, fn, DIR_SEP);
+ snprintf(bak, sizeof(bak), "%s_32-64-convert", fn);
+ {
+ FILE *fp1;
+ long off;
+ int curid;
+
+ /* read the current log id without disturbing
+ * the file pointer */
+ off = ftell(fp);
+ if (fscanf(fp, "%d", &curid) != 1)
+ curid = -1; /* shouldn't happen? */
+ fseek(fp, off, SEEK_SET);
+
+ if ((fp1 = fopen(bak, "r")) != NULL) {
+ /* file indicating that we need to do
+ * a 32->64 bit OID conversion exists;
+ * record the fact in case we get
+ * interrupted, and set the flag so
+ * that we actually do what's asked */
+ fclose(fp1);
+ /* first create a versioned file using
+ * the current log id */
+ fp1 = fopen(cvfile, "w");
+ fprintf(fp1, "%d\n", curid);
+ fclose(fp1);
+ /* then remove the unversioned file
+ * that gdk_bbp created (in this
+ * order!) */
+ unlink(bak);
+ /* set the flag that we need to convert */
+ lg->read32bitoid = 1;
+ } else if ((fp1 = fopen(cvfile, "r")) != NULL) {
+ /* the versioned conversion file
+ * exists: check version */
+ int newid;
+
+ if (fscanf(fp1, "%d", &newid) == 1 &&
+ newid == curid) {
+ /* versions match, we need to
+ * convert */
+ lg->read32bitoid = 1;
+ }
+ fclose(fp1);
+ if (!lg->read32bitoid) {
+ /* no conversion, so we can
+ * remove the versioned
+ * file */
+ unlink(cvfile);
+ }
+ }
+ }
+#endif
lg->changes++;
logger_readlogs(lg, fp, filename);
fclose(fp);
fp = NULL;
+#if SIZEOF_OID == 8
+ if (lg->read32bitoid) {
+ /* we converted, remove versioned file and
+ * reset conversion flag */
+ unlink(cvfile);
+ lg->read32bitoid = 0;
+ }
+#endif
if (lg->postfuncp)
(*lg->postfuncp)(lg);
}
diff --git a/gdk/gdk_logger.h b/gdk/gdk_logger.h
--- a/gdk/gdk_logger.h
+++ b/gdk/gdk_logger.h
@@ -53,6 +53,11 @@ typedef struct logger {
int version;
lng id;
int tid;
+#if SIZEOF_OID == 8
+ /* on 64-bit architecture, read OIDs as 32 bits (for upgrading
+ * oid size) */
+ int read32bitoid;
+#endif
char *fn;
char *dir;
preversionfix_fptr prefuncp;
diff --git a/monetdb5/modules/mal/pcre.c b/monetdb5/modules/mal/pcre.c
--- a/monetdb5/modules/mal/pcre.c
+++ b/monetdb5/modules/mal/pcre.c
@@ -447,6 +447,7 @@ pcre_uselect(BAT **res, str pattern, BAT
r->tsorted = FALSE;
my_pcre_free(re);
+ my_pcre_free(pe);
if (!(r->batDirty&2)) r = BATsetaccess(r, BAT_READ);
*res = r;
return MAL_SUCCEED;
diff --git a/monetdb5/modules/mal/tablet.mx b/monetdb5/modules/mal/tablet.mx
--- a/monetdb5/modules/mal/tablet.mx
+++ b/monetdb5/modules/mal/tablet.mx
@@ -1142,7 +1142,7 @@ create_loadformat(Tablet * as, BAT *name
fmt[p].name = (char *) bun_tail(names, p);
fmt[p].sep = sep_dup((char *) bun_tail(seps, p));
fmt[p].seplen = (int) strlen(fmt[p].sep);
- fmt[p].type = (char *) bun_tail(types, p);
+ fmt[p].type = GDKstrdup((char *) bun_tail(types, p));
fmt[p].adt = ATOMindex(fmt[p].type);
if (fmt[p].adt <= 0) {
GDKerror("create_loadformat: %s has unknown type %s
(using str instead).\n", fmt[p].name, fmt[p].name);
@@ -1196,7 +1196,7 @@ create_dumpformat(Tablet * as, BAT *name
fmt[p].name = (char *) bun_tail(names, p);
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list