Back-patch into 7.2 branch the 7.3 changes that made contrib/seg
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 16 Jul 2005 19:48:16 +0000 (19:48 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 16 Jul 2005 19:48:16 +0000 (19:48 +0000)
error messages reasonably independent of the bison version used to
build segparse.c.   Needed to get this branch passing on buildfarm.

contrib/seg/Makefile
contrib/seg/expected/seg.out
contrib/seg/segparse.y

index ac9b543d83ab1a0d73b38fcf76945499387e1ed6..34fff5fb8aec8488b2700da11994bb8c632e37c3 100644 (file)
@@ -1,4 +1,4 @@
-# $Header: /cvsroot/pgsql/contrib/seg/Makefile,v 1.6 2001/11/16 16:32:33 petere Exp $
+# $Header: /cvsroot/pgsql/contrib/seg/Makefile,v 1.6.2.1 2005/07/16 19:48:15 tgl Exp $
 
 subdir = contrib/seg
 top_builddir = ../..
@@ -13,11 +13,17 @@ REGRESS = seg
 
 segparse.c: segparse.h ;
 
+# The sed hack is so that we can get the same error messages with
+# bison 1.875 and later as we did with earlier bisons.  Eventually,
+# I suppose, we should re-standardize on "syntax error" --- in which
+# case flip the sed translation, but don't remove it.
+
 segparse.h: segparse.y
 ifdef YACC
    $(YACC) -d $(YFLAGS) -p seg_yy $<
-   mv -f y.tab.c segparse.c
+   sed -e 's/"syntax error/"parse error/' < y.tab.c > segparse.c
    mv -f y.tab.h segparse.h
+   rm -f y.tab.c
 else
    @$(missing) bison $< $@
 endif
index 9abfdc2ecb84f2f6632ab694fc62674279f31942..ca3fe33103904c2e1c0daf498f8efec85452f113 100644 (file)
@@ -393,25 +393,25 @@ SELECT '100(+-)1'::seg AS seg;
 SELECT ''::seg AS seg;
 ERROR:  seg_in: can't parse an empty string
 SELECT 'ABC'::seg AS seg;
-ERROR:  parse error, expecting `FLOAT' or `RANGE' or `EXTENSION' at or near position 1, character ('A', \101), input: 'ABC'
+ERROR:  parse error at or near position 1, character ('A', \101), input: 'ABC'
 
 SELECT '1ABC'::seg AS seg;
-ERROR:  expecting end of input at or near position 2, character ('A', \101), input: '1ABC'
+ERROR:  parse error at or near position 2, character ('A', \101), input: '1ABC'
 
 SELECT '1.'::seg AS seg;
-ERROR:  expecting end of input at or near position 2, character ('.', \056), input: '1.'
+ERROR:  parse error at or near position 2, character ('.', \056), input: '1.'
 
 SELECT '1.....'::seg AS seg;
-ERROR:  expecting end of input at or near position 6, character ('.', \056), input: '1.....'
+ERROR:  parse error at or near position 6, character ('.', \056), input: '1.....'
 
 SELECT '.1'::seg AS seg;
-ERROR:  parse error, expecting `FLOAT' or `RANGE' or `EXTENSION' at or near position 2, character ('1', \061), input: '.1'
+ERROR:  parse error at or near position 2, character ('1', \061), input: '.1'
 
 SELECT '1..2.'::seg AS seg;
-ERROR:  expecting end of input at or near position 5, character ('.', \056), input: '1..2.'
+ERROR:  parse error at or near position 5, character ('.', \056), input: '1..2.'
 
 SELECT '1 e7'::seg AS seg;
-ERROR:  expecting end of input at or near position 3, character ('e', \145), input: '1 e7'
+ERROR:  parse error at or near position 3, character ('e', \145), input: '1 e7'
 
 SELECT '1e700'::seg AS seg;
 ERROR:  numeric value 1e700 unrepresentable
index 9bd972f2c4d63300ce45573f6275eef2106f43f7..7d785ab2ac23015297bae69f49d6c836eda39eab 100644 (file)
@@ -1,17 +1,16 @@
 %{
-#define YYERROR_VERBOSE   
 #define YYPARSE_PARAM result  /* need this to pass a pointer (void *) to yyparse */
   
-#include <string.h>
-#include <stdlib.h>
+#include "postgres.h"
+
 #include <errno.h>
 #include <math.h>
+
+#include "utils/elog.h"
+
 #include "segdata.h"
 #include "buffer.h"
   
-#include "postgres.h"
-#include "utils/elog.h"
-  
 #ifdef __CYGWIN__
 #define HUGE HUGE_VAL
 #endif /* __CYGWIN__ */
@@ -147,9 +146,9 @@ float seg_atof ( char *value ) {
   sscanf(value, "%f", &result);
 
   if ( errno ) {
-    sprintf(buf, "numeric value %s unrepresentable", value);
+    snprintf(buf, 256, "numeric value %s unrepresentable", value);
     reset_parse_buffer();     
-    elog(ERROR, buf);
+    elog(ERROR, "%s", buf);
   }
 
   return result;
@@ -168,8 +167,9 @@ int seg_yyerror ( char *msg ) {
 
   position = parse_buffer_pos() > parse_buffer_size() ? parse_buffer_pos() - 1 : parse_buffer_pos();
 
-  sprintf(
+  snprintf(
      buf, 
+     256,
      "%s at or near position %d, character ('%c', \\%03o), input: '%s'\n", 
      msg,
      position,
@@ -179,7 +179,7 @@ int seg_yyerror ( char *msg ) {
      );
 
   reset_parse_buffer();     
-  elog(ERROR, buf);
+  elog(ERROR, "%s", buf);
   return 0;
 }