From a2226ad2373dcea5063fb8dafee1d52487be15cd Mon Sep 17 00:00:00 2001 From: Bruce Momjian <bruce@momjian.us> Date: Sun, 13 Feb 2000 18:59:53 +0000 Subject: [PATCH] contrib-array.patch this is an old patch which I have already submitted and never seen in the sources. It corrects the datatype oids used in some iterator functions. This bug has been reported to me by many other people. contrib-datetime.patch some code contributed by Reiner Dassing <dassing@wettzell.ifag.de> contrib-makefiles.patch fixes all my contrib makefiles which don't work with some compilers, as reported to me by another user. contrib-miscutil.patch an old patch for one of my old contribs. contrib-string.patch a small change to the c-like text output functions. Now the '{' is escaped only at the beginning of the string to distinguish it from arrays, and the '}' is no more escaped. elog-lineno.patch adds the current lineno of CopyFrom to elog messages. This is very useful when you load a 1 million tuples table from an external file and there is a bad value somehere. Currently you get an error message but you can't know where is the bad data. The patch uses a variable which was declared static in copy.c. The variable is now exported and initialized to 0. It is always cleared at the end of the copy or at the first elog message or when the copy is canceled. I know this is very ugly but I can't find any better way of knowing where the copy fails and I have this problem quite often. plperl-makefile.patch fixes a typo in a makefile, but the error must be elsewhere because it is a file generated automatically. Please have a look. tprintf-timestamp.patch restores the original 2-digit year format, assuming that the two century digits don't carry much information and that '000202' is easier to read than 20000202. Being only a log file it shouldn't break anything. Please apply the patches before the next scheduled code freeze. I also noticed that some of the contribs don't compile correcly. Should we ask people to fix their code or rename their makefiles so that they are ignored by the top makefile? -- Massimo Dal Zotto --- contrib/array/Makefile | 8 +++--- contrib/array/array_iterator.c | 18 ++++++------- contrib/datetime/Makefile | 8 +++--- contrib/datetime/datetime_functions.c | 14 +++++++++- contrib/miscutil/Makefile | 8 +++--- contrib/miscutil/misc_utils.c | 2 ++ contrib/miscutil/misc_utils.h | 6 +++-- contrib/string/Makefile | 8 +++--- contrib/string/string_io.c | 37 +++++++++++++++++---------- contrib/string/string_io.h | 19 ++++++-------- contrib/userlock/Makefile | 8 +++--- src/backend/commands/copy.c | 9 ++++--- src/backend/utils/error/elog.c | 13 ++++++++-- src/backend/utils/misc/trace.c | 4 +-- src/include/commands/copy.h | 3 ++- src/include/utils/trace.h | 2 +- src/pl/plperl/Makefile.PL | 2 +- 17 files changed, 102 insertions(+), 67 deletions(-) diff --git a/contrib/array/Makefile b/contrib/array/Makefile index 85e8d42ade4..951250a29dd 100644 --- a/contrib/array/Makefile +++ b/contrib/array/Makefile @@ -11,10 +11,10 @@ SRCDIR = $(PGDIR)/src include $(SRCDIR)/Makefile.global -INCLUDE_OPT = -I ./ \ - -I $(SRCDIR)/ \ - -I $(SRCDIR)/include \ - -I $(SRCDIR)/port/$(PORTNAME) +INCLUDE_OPT = -I./ \ + -I$(SRCDIR)/ \ + -I$(SRCDIR)/include \ + -I$(SRCDIR)/port/$(PORTNAME) CFLAGS += $(INCLUDE_OPT) $(CFLAGS_SL) diff --git a/contrib/array/array_iterator.c b/contrib/array/array_iterator.c index 5417d2da52f..cadda58a8f4 100644 --- a/contrib/array/array_iterator.c +++ b/contrib/array/array_iterator.c @@ -66,7 +66,7 @@ array_iterator(Oid elemtype, Oid proc, int and, ArrayType *array, Datum value) } /* Lookup element type information */ - typ_tuple = SearchSysCacheTuple(TYPOID, ObjectIdGetDatum(elemtype), 0, 0, 0); + typ_tuple = SearchSysCacheTuple(TYPEOID, ObjectIdGetDatum(elemtype), 0, 0, 0); if (!HeapTupleIsValid(typ_tuple)) { elog(ERROR, "array_iterator: cache lookup failed for type %d", elemtype); @@ -183,7 +183,7 @@ array_all_textregexeq(ArrayType *array, char *value) int32 array_varchareq(ArrayType *array, char *value) { - return array_iterator((Oid) 20, /* varchar */ + return array_iterator((Oid) 1043, /* varchar */ (Oid) 1070, /* varchareq */ 0, /* logical or */ array, (Datum) value); @@ -192,7 +192,7 @@ array_varchareq(ArrayType *array, char *value) int32 array_all_varchareq(ArrayType *array, char *value) { - return array_iterator((Oid) 20, /* varchar */ + return array_iterator((Oid) 1043, /* varchar */ (Oid) 1070, /* varchareq */ 1, /* logical and */ array, (Datum) value); @@ -201,7 +201,7 @@ array_all_varchareq(ArrayType *array, char *value) int32 array_varcharregexeq(ArrayType *array, char *value) { - return array_iterator((Oid) 20, /* varchar */ + return array_iterator((Oid) 1043, /* varchar */ (Oid) 1254, /* textregexeq */ 0, /* logical or */ array, (Datum) value); @@ -210,7 +210,7 @@ array_varcharregexeq(ArrayType *array, char *value) int32 array_all_varcharregexeq(ArrayType *array, char *value) { - return array_iterator((Oid) 20, /* varchar */ + return array_iterator((Oid) 1043, /* varchar */ (Oid) 1254, /* textregexeq */ 1, /* logical and */ array, (Datum) value); @@ -224,7 +224,7 @@ array_all_varcharregexeq(ArrayType *array, char *value) int32 array_bpchareq(ArrayType *array, char *value) { - return array_iterator((Oid) 20, /* bpchar */ + return array_iterator((Oid) 1042, /* bpchar */ (Oid) 1048, /* bpchareq */ 0, /* logical or */ array, (Datum) value); @@ -233,7 +233,7 @@ array_bpchareq(ArrayType *array, char *value) int32 array_all_bpchareq(ArrayType *array, char *value) { - return array_iterator((Oid) 20, /* bpchar */ + return array_iterator((Oid) 1042, /* bpchar */ (Oid) 1048, /* bpchareq */ 1, /* logical and */ array, (Datum) value); @@ -242,7 +242,7 @@ array_all_bpchareq(ArrayType *array, char *value) int32 array_bpcharregexeq(ArrayType *array, char *value) { - return array_iterator((Oid) 20, /* bpchar */ + return array_iterator((Oid) 1042, /* bpchar */ (Oid) 1254, /* textregexeq */ 0, /* logical or */ array, (Datum) value); @@ -251,7 +251,7 @@ array_bpcharregexeq(ArrayType *array, char *value) int32 array_all_bpcharregexeq(ArrayType *array, char *value) { - return array_iterator((Oid) 20, /* bpchar */ + return array_iterator((Oid) 1042, /* bpchar */ (Oid) 1254, /* textregexeq */ 1, /* logical and */ array, (Datum) value); diff --git a/contrib/datetime/Makefile b/contrib/datetime/Makefile index b53293e1722..195c0f8d689 100644 --- a/contrib/datetime/Makefile +++ b/contrib/datetime/Makefile @@ -11,10 +11,10 @@ SRCDIR = $(PGDIR)/src include $(SRCDIR)/Makefile.global -INCLUDE_OPT = -I ./ \ - -I $(SRCDIR)/ \ - -I $(SRCDIR)/include \ - -I $(SRCDIR)/port/$(PORTNAME) +INCLUDE_OPT = -I./ \ + -I$(SRCDIR)/ \ + -I$(SRCDIR)/include \ + -I$(SRCDIR)/port/$(PORTNAME) CFLAGS += $(INCLUDE_OPT) $(CFLAGS_SL) diff --git a/contrib/datetime/datetime_functions.c b/contrib/datetime/datetime_functions.c index 910647118aa..c5b8bc25e9d 100644 --- a/contrib/datetime/datetime_functions.c +++ b/contrib/datetime/datetime_functions.c @@ -5,6 +5,8 @@ * * Copyright (C) 1999, Massimo Dal Zotto <dz@cs.unitn.it> * + * Date2mjd code contributed by Reiner Dassing <dassing@wettzell.ifag.de> + * * This software is distributed under the GNU General Public License * either version 2, or (at your option) any later version. */ @@ -73,7 +75,7 @@ decode_24h_time(char *str, struct tm *tm, double *fsec) if ( (tm->tm_hour < 0) || (tm->tm_hour > 24) || (tm->tm_min < 0) || (tm->tm_min > 59) || (tm->tm_sec < 0) || (tm->tm_sec > 59) - || (fsec < 0) ) + || (*fsec < 0) ) return -1; return 0; @@ -260,6 +262,16 @@ currentdate() return (date); } +int4 +date2mjd(DateADT val) +{ + int result; + + result = val + JDATE_2000 - 2400000.5; + + return result; +} + /* end of file */ /* diff --git a/contrib/miscutil/Makefile b/contrib/miscutil/Makefile index fa3c99fa1db..fd0065b86ef 100644 --- a/contrib/miscutil/Makefile +++ b/contrib/miscutil/Makefile @@ -11,10 +11,10 @@ SRCDIR = $(PGDIR)/src include $(SRCDIR)/Makefile.global -INCLUDE_OPT = -I ./ \ - -I $(SRCDIR)/ \ - -I $(SRCDIR)/include \ - -I $(SRCDIR)/port/$(PORTNAME) +INCLUDE_OPT = -I./ \ + -I$(SRCDIR)/ \ + -I$(SRCDIR)/include \ + -I$(SRCDIR)/port/$(PORTNAME) CFLAGS += $(INCLUDE_OPT) $(CFLAGS_SL) diff --git a/contrib/miscutil/misc_utils.c b/contrib/miscutil/misc_utils.c index 21341dc73c9..6745b5b8bb9 100644 --- a/contrib/miscutil/misc_utils.c +++ b/contrib/miscutil/misc_utils.c @@ -121,6 +121,7 @@ active_listeners(text *relname) return count; } +#ifdef USE_ASSERT_CHECKING int assert_enable(int val) { @@ -134,6 +135,7 @@ assert_test(int val) return assertTest(val); } #endif +#endif /* end of file */ diff --git a/contrib/miscutil/misc_utils.h b/contrib/miscutil/misc_utils.h index 61217244a2d..139df3bc775 100644 --- a/contrib/miscutil/misc_utils.h +++ b/contrib/miscutil/misc_utils.h @@ -6,13 +6,15 @@ int backend_pid(void); int unlisten(char *relname); int max(int x, int y); int min(int x, int y); -int assert_enable(int val); +int active_listeners(text *relname); +#ifdef USE_ASSERT_CHECKING +int assert_enable(int val); #ifdef ASSERT_CHECKING_TEST int assert_test(int val); #endif +#endif -int active_listeners(text *relname); #endif /* diff --git a/contrib/string/Makefile b/contrib/string/Makefile index b77ace937cf..dd8f0e6f2a6 100644 --- a/contrib/string/Makefile +++ b/contrib/string/Makefile @@ -11,10 +11,10 @@ SRCDIR = $(PGDIR)/src include $(SRCDIR)/Makefile.global -INCLUDE_OPT = -I ./ \ - -I $(SRCDIR)/ \ - -I $(SRCDIR)/include \ - -I $(SRCDIR)/port/$(PORTNAME) +INCLUDE_OPT = -I./ \ + -I$(SRCDIR)/ \ + -I$(SRCDIR)/include \ + -I$(SRCDIR)/port/$(PORTNAME) CFLAGS += $(INCLUDE_OPT) $(CFLAGS_SL) diff --git a/contrib/string/string_io.c b/contrib/string/string_io.c index e1fc867497f..9407e6a21b3 100644 --- a/contrib/string/string_io.c +++ b/contrib/string/string_io.c @@ -50,8 +50,8 @@ * representation of data. */ -char * -string_output(char *data, int size) +unsigned char * +string_output(unsigned char *data, int size) { register unsigned char c, *p, @@ -79,8 +79,6 @@ string_output(char *data, int size) { case '\\': case '"': - case '{': - case '}': case '\b': case '\f': case '\n': @@ -89,6 +87,12 @@ string_output(char *data, int size) case '\v': len++; break; + case '{': + /* Escape beginning of string, to distinguish from arrays */ + if (p == data) { + len++; + } + break; default: if (NOTPRINTABLE(*p)) len += 3; @@ -104,8 +108,6 @@ string_output(char *data, int size) { case '\\': case '"': - case '{': - case '}': *r++ = '\\'; *r++ = c; break; @@ -133,6 +135,13 @@ string_output(char *data, int size) *r++ = '\\'; *r++ = 'v'; break; + case '{': + /* Escape beginning of string, to distinguish from arrays */ + if (p == data) { + *r++ = '\\'; + } + *r++ = c; + break; default: if (NOTPRINTABLE(c)) { @@ -180,8 +189,8 @@ string_output(char *data, int size) * a pointer to the new string or the header. */ -char * -string_input(char *str, int size, int hdrsize, int *rtn_size) +unsigned char * +string_input(unsigned char *str, int size, int hdrsize, int *rtn_size) { register unsigned char *p, *r; @@ -285,7 +294,7 @@ string_input(char *str, int size, int hdrsize, int *rtn_size) return ((char *) result); } -char * +unsigned char * c_charout(int32 c) { char str[2]; @@ -300,7 +309,7 @@ c_charout(int32 c) * This can be used for SET, bytea, text and unknown data types */ -char * +unsigned char * c_textout(struct varlena * vlena) { int len = 0; @@ -318,8 +327,8 @@ c_textout(struct varlena * vlena) * This can be used for varchar and bpchar strings */ -char * -c_varcharout(char *s) +unsigned char * +c_varcharout(unsigned char *s) { int len = 0; @@ -333,7 +342,7 @@ c_varcharout(char *s) #if 0 struct varlena * -c_textin(char *str) +c_textin(unsigned char *str) { struct varlena *result; int len; @@ -348,7 +357,7 @@ c_textin(char *str) } int32 * -c_charin(char *str) +c_charin(unsigned char *str) { return (string_input(str, 1, 0, NULL)); } diff --git a/contrib/string/string_io.h b/contrib/string/string_io.h index b1d2b7e2c28..e79d7fd28fe 100644 --- a/contrib/string/string_io.h +++ b/contrib/string/string_io.h @@ -1,19 +1,16 @@ #ifndef STRING_IO_H #define STRING_IO_H -char *string_output(char *data, int size); -char *string_input(char *str, int size, int hdrsize, int *rtn_size); -char *c_charout(int32 c); -char *c_char2out(uint16 s); -char *c_char4out(uint32 s); -char *c_char8out(char *s); -char *c_char16out(char *s); -char *c_textout(struct varlena * vlena); -char *c_varcharout(char *s); +unsigned char* string_output(unsigned char *data, int size); +unsigned char* string_input(unsigned char *str, int size, int hdrsize, + int *rtn_size); +unsigned char* c_charout(int32 c); +unsigned char* c_textout(struct varlena * vlena); +unsigned char* c_varcharout(unsigned char *s); #if 0 -struct varlena *c_textin(char *str); -char *c_char16in(char *str); +struct varlena* c_textin(unsigned char *str); +int32* c_charin(unsigned char *str) #endif #endif diff --git a/contrib/userlock/Makefile b/contrib/userlock/Makefile index 391956ad7e7..23975185b2a 100644 --- a/contrib/userlock/Makefile +++ b/contrib/userlock/Makefile @@ -11,10 +11,10 @@ SRCDIR = $(PGDIR)/src include $(SRCDIR)/Makefile.global -INCLUDE_OPT = -I ./ \ - -I $(SRCDIR)/ \ - -I $(SRCDIR)/include \ - -I $(SRCDIR)/port/$(PORTNAME) +INCLUDE_OPT = -I./ \ + -I$(SRCDIR)/ \ + -I$(SRCDIR)/include \ + -I$(SRCDIR)/port/$(PORTNAME) CFLAGS += $(INCLUDE_OPT) $(CFLAGS_SL) diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c index 7a23a063aaf..85a50c10398 100644 --- a/src/backend/commands/copy.c +++ b/src/backend/commands/copy.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/copy.c,v 1.100 2000/02/09 00:10:11 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/copy.c,v 1.101 2000/02/13 18:59:50 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -64,7 +64,7 @@ static int CountTuples(Relation relation); * Static communication variables ... pretty grotty, but COPY has * never been reentrant... */ -static int lineno; +int lineno = 0; /* used by elog() -- dz */ static bool fe_eof; /* @@ -726,8 +726,10 @@ CopyFrom(Relation rel, bool binary, bool oids, FILE *fp, char *delim, char *null while (!done) { - if (QueryCancel) + if (QueryCancel) { + lineno = 0; CancelQuery(); + } if (!binary) { @@ -931,6 +933,7 @@ CopyFrom(Relation rel, bool binary, bool oids, FILE *fp, char *delim, char *null if (!reading_to_eof && ntuples == tuples_read) done = true; } + lineno = 0; pfree(values); pfree(nulls); pfree(index_nulls); diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c index 71fd9c8354f..1a61d7e6d17 100644 --- a/src/backend/utils/error/elog.c +++ b/src/backend/utils/error/elog.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/error/elog.c,v 1.54 2000/01/26 05:57:20 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/error/elog.c,v 1.55 2000/02/13 18:59:50 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -35,6 +35,7 @@ #include "storage/proc.h" #include "tcop/tcopprot.h" #include "utils/trace.h" +#include "commands/copy.h" extern int errno; extern int sys_nerr; @@ -164,7 +165,7 @@ elog(int lev, const char *fmt, ...) * (since vsnprintf won't know what to do with %m). To keep * space calculation simple, we only allow one %m. */ - space_needed = TIMESTAMP_SIZE + strlen(prefix) + indent + space_needed = TIMESTAMP_SIZE + strlen(prefix) + indent + (lineno ? 24 : 0) + strlen(fmt) + strlen(errorstr) + 1; if (space_needed > (int) sizeof(fmt_fixedbuf)) { @@ -186,6 +187,14 @@ elog(int lev, const char *fmt, ...) bp = fmt_buf + strlen(fmt_buf); while (indent-- > 0) *bp++ = ' '; + + /* If error was in CopyFrom() print the offending line number -- dz */ + if (lineno) { + sprintf(bp, "copy: line %d, ", lineno); + bp = fmt_buf + strlen(fmt_buf); + lineno = 0; + } + for (cp = fmt; *cp; cp++) { if (cp[0] == '%' && cp[1] != '\0') diff --git a/src/backend/utils/misc/trace.c b/src/backend/utils/misc/trace.c index 044afe16519..33ca0ce0a6b 100644 --- a/src/backend/utils/misc/trace.c +++ b/src/backend/utils/misc/trace.c @@ -233,8 +233,8 @@ tprintf_timestamp() time = localtime(&tm); sprintf(pid, "[%d]", MyProcPid); - sprintf(timestamp, "%04d%02d%02d.%02d:%02d:%02d.%03d %7s ", - time->tm_year+1900, time->tm_mon + 1, time->tm_mday, + sprintf(timestamp, "%02d%02d%02d.%02d:%02d:%02d.%03d %7s ", + time->tm_year % 100, time->tm_mon + 1, time->tm_mday, time->tm_hour, time->tm_min, time->tm_sec, (int) (tv.tv_usec/1000), pid); diff --git a/src/include/commands/copy.h b/src/include/commands/copy.h index 6f8c79676a2..ecdb9bbb4e8 100644 --- a/src/include/commands/copy.h +++ b/src/include/commands/copy.h @@ -7,13 +7,14 @@ * Portions Copyright (c) 1996-2000, PostgreSQL, Inc * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: copy.h,v 1.9 2000/01/26 05:58:00 momjian Exp $ + * $Id: copy.h,v 1.10 2000/02/13 18:59:52 momjian Exp $ * *------------------------------------------------------------------------- */ #ifndef COPY_H #define COPY_H +extern int lineno; void DoCopy(char *relname, bool binary, bool oids, bool from, bool pipe, char *filename, char *delim, char *null_print); diff --git a/src/include/utils/trace.h b/src/include/utils/trace.h index 61f0b27da13..3cb2d9e28f1 100644 --- a/src/include/utils/trace.h +++ b/src/include/utils/trace.h @@ -18,7 +18,7 @@ #ifdef ELOG_TIMESTAMPS char *tprintf_timestamp(void); -#define TIMESTAMP_SIZE 30 +#define TIMESTAMP_SIZE 28 #else #define TIMESTAMP_SIZE 0 #endif diff --git a/src/pl/plperl/Makefile.PL b/src/pl/plperl/Makefile.PL index 43773debb5e..9285668917b 100644 --- a/src/pl/plperl/Makefile.PL +++ b/src/pl/plperl/Makefile.PL @@ -107,7 +107,7 @@ plperl : plperl.o SPI.o \$(CC) -c \$(CFLAGS) \$< %.o : %.xs - \$(XSUBPP} \$(TYPEMAP) \$< > xtmp.c + \$(XSUBPP) \$(TYPEMAP) \$< > xtmp.c \$(CC) -c \$(CFLAGS) -o \$@ xtmp.c -- GitLab