Changeset: ead4a7595cee for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ead4a7595cee
Added Files:
sql/test/BugTracker-2013/Tests/copy-into-decimal.Bug-3265.sql
sql/test/BugTracker-2013/Tests/copy-into-decimal.Bug-3265.stable.err
sql/test/BugTracker-2013/Tests/copy-into-decimal.Bug-3265.stable.out
sql/test/BugTracker-2013/Tests/empty-strings.Bug-3261.SQL.py
sql/test/BugTracker-2013/Tests/empty-strings.Bug-3261.stable.err
sql/test/BugTracker-2013/Tests/empty-strings.Bug-3261.stable.out
Modified Files:
clients/mapilib/mapi.c
common/stream/stream.c
common/stream/stream.h
gdk/gdk_atoms.c
gdk/gdk_bbp.c
gdk/gdk_logger.c
gdk/gdk_utils.c
geom/monetdb5/geom.c
monetdb5/modules/atoms/blob.c
monetdb5/modules/atoms/url.c
monetdb5/modules/mal/remote.c
sql/backends/monet5/datacell/actuator.c
sql/backends/monet5/datacell/receptor.c
sql/backends/monet5/sql_result.c
sql/test/BugTracker-2013/Tests/All
Branch: default
Log Message:
Merge with Feb2013 branch.
diffs (truncated from 1991 to 300 lines):
diff --git a/clients/mapilib/mapi.c b/clients/mapilib/mapi.c
--- a/clients/mapilib/mapi.c
+++ b/clients/mapilib/mapi.c
@@ -1036,8 +1036,8 @@ static int mapi_initialized = 0;
do { \
if ((s) == NULL || mnstr_errnr(s)) { \
mapi_log_record(mid,msg); \
- mapi_log_record(mid,f); \
- close_connection(mid); \
+ mapi_log_record(mid,f); \
+ close_connection(mid); \
mapi_setError((mid), (msg), (f), MTIMEOUT); \
return (e); \
} \
@@ -3290,12 +3290,12 @@ read_line(Mapi mid)
if (mid->trace == MAPI_TRACE)
printf("fetch next block: start at:%d\n", mid->blk.end);
len = mnstr_read(mid->from, mid->blk.buf + mid->blk.end, 1,
BLOCK);
+ check_stream(mid, mid->from, "Connection terminated",
"read_line", (mid->blk.eos = 1, (char *) 0));
if (mid->tracelog) {
mapi_log_header(mid, "R");
mnstr_write(mid->tracelog, mid->blk.buf + mid->blk.end,
1, len);
mnstr_flush(mid->tracelog);
}
- check_stream(mid, mid->from, "Connection terminated",
"read_line", (mid->blk.eos = 1, (char *) 0));
mid->blk.buf[mid->blk.end + len] = 0;
if (mid->trace == MAPI_TRACE) {
printf("got next block: length:" SSZFMT "\n", len);
diff --git a/common/stream/stream.c b/common/stream/stream.c
--- a/common/stream/stream.c
+++ b/common/stream/stream.c
@@ -174,7 +174,7 @@ mnstr_init(void)
/* #define BSTREAM_DEBUG 1 */
/* Read at most cnt elements of size elmsize from the stream. Returns
- the number of elements actually read. */
+ * the number of elements actually read or < 0 on failure. */
ssize_t
mnstr_read(stream *s, void *buf, size_t elmsize, size_t cnt)
{
@@ -183,12 +183,13 @@ mnstr_read(stream *s, void *buf, size_t
#endif
assert(s->access == ST_READ);
if (s->errnr)
- return s->errnr;
+ return -1;
return (*s->read) (s, buf, elmsize, cnt);
}
-/* Read one line (seperated by \n) of atmost maxcnt characters from the
stream.
- Returns the number of characters actually read, includes the trailing \n */
+/* Read one line (seperated by \n) of atmost maxcnt characters from
+ * the stream. Returns the number of characters actually read,
+ * includes the trailing \n */
ssize_t
mnstr_readline(stream *s, void *buf, size_t maxcnt)
{
@@ -197,7 +198,7 @@ mnstr_readline(stream *s, void *buf, siz
#endif
assert(s->access == ST_READ);
if (s->errnr)
- return s->errnr;
+ return -1;
if (!s->readline) {
size_t len = 0;
char *b = buf, *start = buf;
@@ -206,15 +207,15 @@ mnstr_readline(stream *s, void *buf, siz
break;
}
if (s->errnr)
- return s->errnr;
+ return -1;
return (ssize_t) (start - b);
} else
return (*s->readline) (s, buf, maxcnt);
}
/* Write cnt elements of size elmsize to the stream. Returns the
- number of elements actually written. If elmsize or cnt equals zero,
- returns cnt. */
+ * number of elements actually written. If elmsize or cnt equals zero,
+ * returns cnt. */
ssize_t
mnstr_write(stream *s, const void *buf, size_t elmsize, size_t cnt)
{
@@ -223,7 +224,7 @@ mnstr_write(stream *s, const void *buf,
#endif
assert(s->access == ST_WRITE);
if (s->errnr)
- return s->errnr;
+ return -1;
return (*s->write) (s, buf, elmsize, cnt);
}
@@ -265,6 +266,7 @@ mnstr_error(stream *s)
return (*s->error) (s);
}
+/* flush buffer, return 0 on success, non-zero on failure */
int
mnstr_flush(stream *s)
{
@@ -275,12 +277,13 @@ mnstr_flush(stream *s)
#endif
assert(s->access == ST_WRITE);
if (s->errnr)
- return s->errnr;
+ return -1;
if (s->flush)
return (*s->flush) (s);
return 0;
}
+/* sync file to disk, return 0 on success, non-zero on failure */
int
mnstr_fsync(stream *s)
{
@@ -291,7 +294,7 @@ mnstr_fsync(stream *s)
#endif
assert(s->access == ST_WRITE);
if (s->errnr)
- return s->errnr;
+ return -1;
if (s->fsync)
return (*s->fsync) (s);
return 0;
@@ -306,7 +309,7 @@ mnstr_fgetpos(stream *s, lng *p)
printf("fgetpos %s\n", s->name ? s->name : "<unnamed>");
#endif
if (s->errnr)
- return s->errnr;
+ return -1;
if (s->fgetpos)
return (*s->fgetpos) (s, p);
return 0;
@@ -321,7 +324,7 @@ mnstr_fsetpos(stream *s, lng p)
printf("fsetpos %s\n", s->name ? s->name : "<unnamed>");
#endif
if (s->errnr)
- return s->errnr;
+ return -1;
if (s->fsetpos)
return (*s->fsetpos) (s, p);
return 0;
@@ -494,8 +497,10 @@ file_read(stream *s, void *buf, size_t e
if (!feof(fp)) {
rc = fread(buf, elmsize, cnt, fp);
- if (ferror(fp))
+ if (ferror(fp)) {
s->errnr = MNSTR_READ_ERROR;
+ return -1;
+ }
}
return (ssize_t) rc;
}
@@ -506,8 +511,10 @@ file_write(stream *s, const void *buf, s
if (elmsize && cnt) {
size_t rc = fwrite(buf, elmsize, cnt, (FILE *)
s->stream_data.p);
- if (rc < cnt)
+ if (ferror((FILE *) s->stream_data.p)) {
s->errnr = MNSTR_WRITE_ERROR;
+ return -1;
+ }
return (ssize_t) rc;
}
return (ssize_t) cnt;
@@ -537,7 +544,7 @@ file_flush(stream *s)
if (s->access == ST_WRITE && fflush(fp) < 0) {
s->errnr = MNSTR_WRITE_ERROR;
- return 1;
+ return -1;
}
return 0;
}
@@ -562,7 +569,7 @@ file_fsync(stream *s)
#endif
) {
s->errnr = MNSTR_WRITE_ERROR;
- return 1;
+ return -1;
}
return 0;
}
@@ -581,7 +588,7 @@ file_fgetpos(stream *s, lng *p)
*p = (lng) ftell(fp); /* returns long */
#endif
#endif
- return 0;
+ return *p < 0 ? -1 : 0;
}
static int
@@ -657,11 +664,15 @@ stream_gzread(stream *s, void *buf, size
{
gzFile fp = (gzFile) s->stream_data.p;
int size = (int) (elmsize * cnt);
+ int err;
if (!gzeof(fp)) {
size = gzread(fp, buf, size);
- if (size)
- return (ssize_t) (size / elmsize);
+ if (gzerror(fp, &err) != NULL) {
+ s->errnr = MNSTR_READ_ERROR;
+ return -1;
+ }
+ return (ssize_t) (size / elmsize);
}
return 0;
}
@@ -669,10 +680,16 @@ stream_gzread(stream *s, void *buf, size
static ssize_t
stream_gzwrite(stream *s, const void *buf, size_t elmsize, size_t cnt)
{
+ gzFile fp = (gzFile) s->stream_data.p;
int size = (int) (elmsize * cnt);
+ int err;
if (size) {
- size = gzwrite((gzFile) s->stream_data.p, buf, size);
+ size = gzwrite(fp, buf, size);
+ if (gzerror(fp, &err) != NULL) {
+ s->errnr = MNSTR_WRITE_ERROR;
+ return -1;
+ }
return (ssize_t) (size / elmsize);
}
return (ssize_t) cnt;
@@ -689,8 +706,9 @@ stream_gzclose(stream *s)
static int
stream_gzflush(stream *s)
{
- if (s->access == ST_WRITE)
- gzflush((gzFile) s->stream_data.p, Z_SYNC_FLUSH);
+ if (s->access == ST_WRITE &&
+ gzflush((gzFile) s->stream_data.p, Z_SYNC_FLUSH) != Z_OK)
+ return -1;
return 0;
}
@@ -737,8 +755,11 @@ open_gzwstream_(const char *filename, co
return NULL;
s->access = ST_WRITE;
s->type = ST_BIN;
- if (s->errnr == MNSTR_NO__ERROR)
- gzwrite((gzFile) s->stream_data.p, (void *) &s->byteorder,
sizeof(s->byteorder));
+ if (s->errnr == MNSTR_NO__ERROR &&
+ gzwrite((gzFile) s->stream_data.p, (void *) &s->byteorder,
sizeof(s->byteorder)) < (int) sizeof(s->byteorder)) {
+ stream_gzclose(s);
+ s->errnr = MNSTR_OPEN_ERROR;
+ }
return s;
}
@@ -847,8 +868,11 @@ stream_bzread(stream *s, void *buf, size
stream_bzclose(s);
}
}
- if (err == BZ_OK)
- return size / elmsize;
+ if (err != BZ_OK) {
+ s->errnr = MNSTR_READ_ERROR;
+ return -1;
+ }
+ return size / elmsize;
}
return 0;
}
@@ -861,8 +885,11 @@ stream_bzwrite(stream *s, const void *bu
if (size) {
BZ2_bzWrite(&err, ((struct bz *) s->stream_data.p)->b, (void *)
buf, size);
- if (err == BZ_OK)
- return cnt;
+ if (err != BZ_OK) {
+ s->errnr = MNSTR_WRITE_ERROR;
+ return -1;
+ }
+ return cnt;
}
return 0;
}
@@ -928,8 +955,11 @@ open_bzwstream_(const char *filename, co
return NULL;
s->access = ST_WRITE;
s->type = ST_BIN;
- if (s->errnr == MNSTR_NO__ERROR)
- stream_bzwrite(s, (void *) &s->byteorder, sizeof(s->byteorder),
1);
+ if (s->errnr == MNSTR_NO__ERROR &&
+ stream_bzwrite(s, (void *) &s->byteorder, sizeof(s->byteorder), 1)
!= 1) {
+ stream_bzclose(s);
+ s->errnr = MNSTR_OPEN_ERROR;
+ }
return s;
}
@@ -1004,18 +1034,14 @@ open_rstream(const char *filename)
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list