Changeset: 5142650ffe98 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=5142650ffe98 Modified Files: clients/Tests/SQL-dump.stable.out.32bit configure.ag gdk/gdk_logger.c gdk/gdk_posix.c gdk/gdk_private.h gdk/gdk_storage.c sql/test/pg_regress/Tests/char.sql sql/test/pg_regress/Tests/char.stable.err sql/test/pg_regress/Tests/char.stable.out sql/test/pg_regress/Tests/float4.sql sql/test/pg_regress/Tests/float4.stable.err sql/test/pg_regress/Tests/float4.stable.out sql/test/pg_regress/Tests/float8.sql sql/test/pg_regress/Tests/float8.stable.err sql/test/pg_regress/Tests/float8.stable.out sql/test/pg_regress/Tests/int2.sql sql/test/pg_regress/Tests/int2.stable.err sql/test/pg_regress/Tests/int2.stable.out sql/test/pg_regress/Tests/int4.sql sql/test/pg_regress/Tests/int4.stable.err sql/test/pg_regress/Tests/int4.stable.out sql/test/pg_regress/Tests/int8.sql sql/test/pg_regress/Tests/int8.stable.err sql/test/pg_regress/Tests/int8.stable.out sql/test/pg_regress/Tests/numerology.sql sql/test/pg_regress/Tests/polygon.sql sql/test/pg_regress/postgresql2sql99.sh testing/Mtest.py.in Branch: bamloader Log Message:
Merge with default branch. diffs (truncated from 3632 to 300 lines): diff --git a/clients/Tests/SQL-dump.stable.out.32bit b/clients/Tests/SQL-dump.stable.out.32bit --- a/clients/Tests/SQL-dump.stable.out.32bit +++ b/clients/Tests/SQL-dump.stable.out.32bit @@ -6998,8 +6998,8 @@ 6302 "text" "create function json.text(j 6306 "text" "create function json.text(js string)\nreturns string external name json.text;" "json" true 1 false false false 6230 6310 "text" "create function json.text(js int)\nreturns string external name json.text;" "json" true 1 false false false 6230 6314 "output" "-- The remainder awaits the implementation \n\ncreate aggregate json.output(js json)\nreturns string external name json.output;" "json" true 3 false false false 6230 -6318 "tojsonarray" "-- create function json.object(*) returns json external name json.objectrender;\n\n-- create function json.array(*) returns json external name json.arrayrender;\n\n-- unnesting the JSON structure\n\n-- create function json.unnest(js json)\n-- returns table( id integer, k string, v string) external name json.unnest;\n\n-- create function json.unnest(js json)\n-- returns table( k string, v string) external name json.unnest;\n\n-- create function json.unnest(js json)\n-- returns table( v string) external name json.unnest;\n\n-- create function json.nest table( id integer, k string, v string)\n-- returns json external name json.nest;\n\ncreate aggregate json.tojsonarray( x string ) returns string external name json.aggr;" "json" true 3 false false false 6230 -6322 "tojsonarray" "create aggregate json.tojsonarray( x double ) returns string external name json.aggr;" "json" true 3 false false false 6230 +6318 "tojsonarray" "-- create function json.object(*) returns json external name json.objectrender;\n\n-- create function json.array(*) returns json external name json.arrayrender;\n\n-- unnesting the JSON structure\n\n-- create function json.unnest(js json)\n-- returns table( id integer, k string, v string) external name json.unnest;\n\n-- create function json.unnest(js json)\n-- returns table( k string, v string) external name json.unnest;\n\n-- create function json.unnest(js json)\n-- returns table( v string) external name json.unnest;\n\n-- create function json.nest table( id integer, k string, v string)\n-- returns json external name json.nest;\n\ncreate aggregate json.tojsonarray( x string ) returns string external name aggr.jsonaggr;" "aggr" true 3 false false false 6230 +6322 "tojsonarray" "create aggregate json.tojsonarray( x double ) returns string external name aggr.jsonaggr;" "aggr" true 3 false false false 6230 6326 "md5" "\n-- The contents of this file are subject to the MonetDB Public License\n-- Version 1.1 (the ""License""); you may not use this file except in\n-- compliance with the License. You may obtain a copy of the License at\n-- http://www.monetdb.org/Legal/MonetDBLicense\n--\n-- Software distributed under the License is distributed on an ""AS IS""\n-- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the\n-- License for the specific language governing rights and limitations\n-- under the License.\n--\n-- The Original Code is the MonetDB Database System.\n--\n-- The Initial Developer of the Original Code is CWI.\n-- Copyright August 2008-2014 MonetDB B.V.\n-- All Rights Reserved.\n\n-- (co) Arjen de Rijke\n-- Functions supporting jsonstore\n\ncreate function sys.md5(v string)\nreturns string external name clients.md5sum;" "clients" true 1 false false false 2000 6331 "uuid" "-- generate a new uuid\ncreate function sys.uuid()\nreturns uuid external name uuid.""new"";" "uuid" true 1 false false false 2000 6334 "isauuid" "create function sys.isauuid(u uuid)\nreturns uuid external name uuid.""isaUUID"";" "uuid" true 1 false false false 2000 diff --git a/configure.ag b/configure.ag --- a/configure.ag +++ b/configure.ag @@ -2879,6 +2879,7 @@ AC_CHECK_FUNCS([\ pipe \ popen \ posix_fadvise \ + posix_fallocate \ posix_madvise \ putenv \ round \ diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c --- a/gdk/gdk_logger.c +++ b/gdk/gdk_logger.c @@ -260,10 +260,11 @@ la_bat_clear(logger *lg, logaction *la) static int log_read_seq(logger *lg, logformat *l) { - lng seq = l->nr; + int seq = (int) l->nr; lng val; BUN p; + assert(l->nr <= (lng) INT_MAX); if (mnstr_readLng(lg->log, &val) != 1) { fprintf(stderr, "!ERROR: log_read_seq: read failed\n"); return LOG_ERR; @@ -1439,9 +1440,18 @@ logger_new(int debug, char *fn, char *lo fclose(fp1); /* first create a versioned file using * the current log id */ - fp1 = fopen(cvfile, "w"); - fprintf(fp1, "%d\n", curid); - fclose(fp1); + if ((fp1 = fopen(cvfile, "w")) == NULL || + fprintf(fp1, "%d\n", curid) < 2 || + fflush(fp1) != 0 || /* make sure it's save on disk */ +#if defined(_MSC_VER) + _commit(_fileno(fp1)) < 0 || +#elif defined(HAVE_FDATASYNC) + fdatasync(fileno(fp1)) < 0 || +#elif defined(HAVE_FSYNC) + fsync(fileno(fp1)) < 0 || +#endif + fclose(fp1) != 0) + logger_fatal("Logger_new: failed to write %s\n", cvfile, 0, 0); /* then remove the unversioned file * that gdk_bbp created (in this * order!) */ diff --git a/gdk/gdk_posix.c b/gdk/gdk_posix.c --- a/gdk/gdk_posix.c +++ b/gdk/gdk_posix.c @@ -423,7 +423,7 @@ MT_mremap(const char *path, int mode, vo fprintf(stderr, "= %s:%d: MT_mremap(%s,"PTRFMT","SZFMT","SZFMT"): open() failed\n", __FILE__, __LINE__, path?path:"NULL", PTRFMTCAST old_address, old_size, *new_size); return NULL; } - if (GDKextendf(fd, *new_size) < 0) { + if (GDKextendf(fd, *new_size, path) < 0) { close(fd); fprintf(stderr, "= %s:%d: MT_mremap(%s,"PTRFMT","SZFMT","SZFMT"): GDKextendf() failed\n", __FILE__, __LINE__, path?path:"NULL", PTRFMTCAST old_address, old_size, *new_size); return NULL; @@ -522,6 +522,9 @@ MT_mremap(const char *path, int mode, vo /* if it failed, try alternative */ } if (p == MAP_FAILED && path != NULL) { +#ifdef HAVE_POSIX_FALLOCATE + int rt; +#endif /* write data to disk, then * mmap it to new address */ if (fd >= 0) @@ -537,9 +540,30 @@ MT_mremap(const char *path, int mode, vo } if (write(fd, old_address, old_size) < 0 || - ftruncate(fd, *new_size) < 0) { +#ifdef HAVE_POSIX_FALLOCATE + /* posix_fallocate returns + * error number on + * failure, not -1, and if + * it returns EINVAL, the + * underlying file system + * may not support the + * operation, so we then + * need to try + * ftruncate */ + ((rt = posix_fallocate(fd, 0, (off_t) *new_size)) == EINVAL ? ftruncate(fd, (off_t) *new_size) < 0 : rt != 0) +#else + ftruncate(fd, (off_t) *new_size) < 0 +#endif + ) { close(fd); - fprintf(stderr, "= %s:%d: MT_mremap(%s,"PTRFMT","SZFMT","SZFMT"): write() or ftruncate() failed\n", __FILE__, __LINE__, path?path:"NULL", PTRFMTCAST old_address, old_size, *new_size); + fprintf(stderr, + "= %s:%d: MT_mremap(%s,"PTRFMT","SZFMT","SZFMT"): write() or " +#ifdef HAVE_POSIX_FALLOCATE + "posix_fallocate()" +#else + "ftruncate()" +#endif + " failed\n", __FILE__, __LINE__, path?path:"NULL", PTRFMTCAST old_address, old_size, *new_size); return NULL; } p = mmap(NULL, *new_size, prot, flags, diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h --- a/gdk/gdk_private.h +++ b/gdk/gdk_private.h @@ -100,7 +100,7 @@ void GDKclrerr(void) __attribute__((__visibility__("hidden"))); int GDKextend(const char *fn, size_t size) __attribute__((__visibility__("hidden"))); -int GDKextendf(int fd, size_t size) +int GDKextendf(int fd, size_t size, const char *fn) __attribute__((__visibility__("hidden"))); int GDKfdlocate(const char *nme, const char *mode, const char *ext) __attribute__((__visibility__("hidden"))); diff --git a/gdk/gdk_storage.c b/gdk/gdk_storage.c --- a/gdk/gdk_storage.c +++ b/gdk/gdk_storage.c @@ -229,35 +229,46 @@ GDKmove(const char *dir1, const char *nm } int -GDKextendf(int fd, size_t size) +GDKextendf(int fd, size_t size, const char *fn) { struct stat stb; + int rt = 0; + int t0 = 0; if (fstat(fd, &stb) < 0) { /* shouldn't happen */ return -1; } /* if necessary, extend the underlying file */ + IODEBUG t0 = GDKms(); if (stb.st_size < (off_t) size) { - return ftruncate(fd, (off_t) size); +#ifdef HAVE_POSIX_FALLOCATE + /* posix_fallocate returns error number on failure, + * not -1 :-( */ + if ((rt = posix_fallocate(fd, 0, (off_t) size)) == EINVAL) + /* on Solaris/OpenIndiana, this may mean that + * the underlying file system doesn't support + * the operation, so just resize the file */ +#endif + rt = ftruncate(fd, (off_t) size); } - return 0; + IODEBUG fprintf(stderr, "#GDKextend %s " SZFMT " -> " SZFMT " %dms%s\n", + fn, (size_t) stb.st_size, size, + GDKms() - t0, rt < 0 ? " (failed)" : ""); + /* return 0 or -1 (posix_fallocate returns != 0 on failure) */ + return -(rt != 0); } int GDKextend(const char *fn, size_t size) { - int t0 = 0; int rt = -1, fd; - IODEBUG t0 = GDKms(); rt = -1; if ((fd = open(fn, O_RDWR)) >= 0) { - rt = GDKextendf(fd, size); + rt = GDKextendf(fd, size, fn); close(fd); } - IODEBUG fprintf(stderr, "#GDKextend %s " SZFMT " %dms%s\n", fn, size, - GDKms() - t0, rt < 0 ? " (failed)" : ""); return rt; } diff --git a/sql/test/pg_regress/Tests/char.sql b/sql/test/pg_regress/Tests/char.sql --- a/sql/test/pg_regress/Tests/char.sql +++ b/sql/test/pg_regress/Tests/char.sql @@ -5,7 +5,7 @@ -- fixed-length by value -- internally passed by value if <= 4 bytes in storage -SELECT char 'c' = char 'c' AS true; +SELECT cast('c' as char) = cast('c' as char) AS "true"; -- -- Build a table for testing diff --git a/sql/test/pg_regress/Tests/char.stable.err b/sql/test/pg_regress/Tests/char.stable.err --- a/sql/test/pg_regress/Tests/char.stable.err +++ b/sql/test/pg_regress/Tests/char.stable.err @@ -70,23 +70,16 @@ stderr of test 'char` in directory 'sql/ # 22:08:26 > -# 22:08:26 > -# 22:08:26 > Mtimeout -timeout 60 mclient -lsql -umonetdb -Pmonetdb --host=pegasus --port=38104 -e < ../../../../../../../../../../mirror/fabian/monetdb/current/sql/src/test/pg_regress/Tests/../monetdb/char.sql -# 22:08:26 > - -MAPI = (monetdb) /var/tmp/mtest-23209/.s.monetdb.33225 -QUERY = SELECT char 'c' = char 'c' AS true; -ERROR = !syntax error, unexpected CHARACTER in: "select char" -MAPI = (monetdb) /var/tmp/mtest-23209/.s.monetdb.33225 +MAPI = (monetdb) /var/tmp/mtest-23239/.s.monetdb.35232 QUERY = INSERT INTO CHAR_TBL (f1) VALUES ('cd'); ERROR = !value too long for type (var)char(1) -MAPI = (monetdb) /var/tmp/mtest-23209/.s.monetdb.33225 +MAPI = (monetdb) /var/tmp/mtest-23239/.s.monetdb.35232 QUERY = INSERT INTO CHAR_TBL (f1) VALUES ('c '); ERROR = !value too long for type (var)char(1) -MAPI = (monetdb) /var/tmp/mtest-23209/.s.monetdb.33225 +MAPI = (monetdb) /var/tmp/mtest-23239/.s.monetdb.35232 QUERY = INSERT INTO CHAR_TBL (f1) VALUES ('abcde'); ERROR = !value too long for type (var)char(4) -MAPI = (monetdb) /var/tmp/mtest-23209/.s.monetdb.33225 +MAPI = (monetdb) /var/tmp/mtest-23239/.s.monetdb.35232 QUERY = INSERT INTO CHAR_TBL (f1) VALUES ('abcd '); ERROR = !value too long for type (var)char(4) diff --git a/sql/test/pg_regress/Tests/char.stable.out b/sql/test/pg_regress/Tests/char.stable.out --- a/sql/test/pg_regress/Tests/char.stable.out +++ b/sql/test/pg_regress/Tests/char.stable.out @@ -34,7 +34,12 @@ Ready. #-- #-- fixed-length by value #-- internally passed by value if <= 4 bytes in storage -#SELECT char 'c' = char 'c' AS true; +#SELECT cast('c' as char) = cast('c' as char) AS "true"; +% .L # table_name +% true # name +% boolean # type +% 5 # length +[ true ] #-- #-- Build a table for testing #-- diff --git a/sql/test/pg_regress/Tests/float4.sql b/sql/test/pg_regress/Tests/float4.sql --- a/sql/test/pg_regress/Tests/float4.sql +++ b/sql/test/pg_regress/Tests/float4.sql @@ -2,7 +2,7 @@ -- float -- -CREATE TABLE FLOAT4_TBL (f1 float); +CREATE TABLE FLOAT4_TBL (f1 real); INSERT INTO FLOAT4_TBL(f1) VALUES (' 0.0'); INSERT INTO FLOAT4_TBL(f1) VALUES ('1004.30 '); @@ -26,22 +26,23 @@ INSERT INTO FLOAT4_TBL(f1) VALUES (' INSERT INTO FLOAT4_TBL(f1) VALUES ('123 5'); -- special inputs -SELECT 'NaN'::float; -SELECT 'nan'::float; -SELECT ' NAN '::float; -SELECT 'infinity'::float; -SELECT ' -INFINiTY '::float; +SELECT cast('NaN' as real); +SELECT cast('nan' as real); +SELECT cast(' NAN ' as real); +SELECT cast('infinity' as real); +SELECT cast(' -INFINiTY ' as real); -- bad special inputs -SELECT 'N A N'::float; -SELECT 'NaN x'::float; -SELECT ' INFINITY x'::float; +SELECT cast('N A N' as real); +SELECT cast('NaN x' as real); +SELECT cast(' INFINITY x' as real); -SELECT 'Infinity'::float + 100.0; -SELECT 'Infinity'::float / 'Infinity'::float; -SELECT 'nan'::float / 'nan'::float; +SELECT cast('Infinity' as real) + 100.0; +SELECT cast('Infinity' as real) / cast('Infinity' as real); +SELECT cast('nan' as real) / cast('nan' as real); SELECT '' AS five, FLOAT4_TBL.*; +SELECT '' AS five, * FROM FLOAT4_TBL; SELECT '' AS four, f.* FROM FLOAT4_TBL f WHERE f.f1 <> '1004.3'; @@ -70,7 +71,7 @@ SELECT '' AS three, f.f1, f.f1 - '-10' A -- test divide by zero SELECT '' AS bad, f.f1 / '0.0' from FLOAT4_TBL f; -SELECT '' AS five, FLOAT4_TBL.*; _______________________________________________ checkin-list mailing list [email protected] https://www.monetdb.org/mailman/listinfo/checkin-list
