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

Reply via email to