show_schema_in_copy_error_context.patch

text/plain

Filename: show_schema_in_copy_error_context.patch
Type: text/plain
Part: 0
Message: Show schema in COPY error CONTEXT strings

Patch

Same data as JSON: GET /api/v1/attachments/:id/patch the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes. API reference →
Format: context
File+
src/backend/commands/copy.c 20 15
src/test/regress/expected/alter_table.out 1 1
src/test/regress/expected/copy2.out 5 5
src/test/regress/expected/domain.out 5 5
src/test/regress/output/constraints.source 1 1
src/test/regress/sql/copy2.sql 1 1
Index: src/backend/commands/copy.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/commands/copy.c,v
retrieving revision 1.327
diff -c -r1.327 copy.c
*** src/backend/commands/copy.c	28 Apr 2010 16:10:41 -0000	1.327
--- src/backend/commands/copy.c	2 May 2010 15:40:52 -0000
***************
*** 119,124 ****
--- 119,125 ----
  	bool	   *force_notnull_flags;	/* per-column CSV FNN flags */
  
  	/* these are just for error messages, see copy_in_error_callback */
+ 	const char *cur_schemaname;	/* schema name for error messages */
  	const char *cur_relname;	/* table name for error messages */
  	int			cur_lineno;		/* line number for error messages */
  	const char *cur_attname;	/* current att for error messages */
***************
*** 1569,1580 ****
  	{
  		/* can't usefully display the data */
  		if (cstate->cur_attname)
! 			errcontext("COPY %s, line %d, column %s",
! 					   cstate->cur_relname, cstate->cur_lineno,
! 					   cstate->cur_attname);
  		else
! 			errcontext("COPY %s, line %d",
! 					   cstate->cur_relname, cstate->cur_lineno);
  	}
  	else
  	{
--- 1570,1582 ----
  	{
  		/* can't usefully display the data */
  		if (cstate->cur_attname)
! 			errcontext("COPY %s.%s, line %d, column %s",
! 					   cstate->cur_schemaname, cstate->cur_relname,
! 					   cstate->cur_lineno, cstate->cur_attname);
  		else
! 			errcontext("COPY %s.%s, line %d",
! 					   cstate->cur_schemaname, cstate->cur_relname,
! 					   cstate->cur_lineno);
  	}
  	else
  	{
***************
*** 1584,1600 ****
  			char	   *attval;
  
  			attval = limit_printout_length(cstate->cur_attval);
! 			errcontext("COPY %s, line %d, column %s: \"%s\"",
! 					   cstate->cur_relname, cstate->cur_lineno,
! 					   cstate->cur_attname, attval);
  			pfree(attval);
  		}
  		else if (cstate->cur_attname)
  		{
  			/* error is relevant to a particular column, value is NULL */
! 			errcontext("COPY %s, line %d, column %s: null input",
! 					   cstate->cur_relname, cstate->cur_lineno,
! 					   cstate->cur_attname);
  		}
  		else
  		{
--- 1586,1602 ----
  			char	   *attval;
  
  			attval = limit_printout_length(cstate->cur_attval);
! 			errcontext("COPY %s.%s, line %d, column %s: \"%s\"",
! 					   cstate->cur_schemaname, cstate->cur_relname,
! 					   cstate->cur_lineno, cstate->cur_attname, attval);
  			pfree(attval);
  		}
  		else if (cstate->cur_attname)
  		{
  			/* error is relevant to a particular column, value is NULL */
! 			errcontext("COPY %s.%s, line %d, column %s: null input",
! 					   cstate->cur_schemaname, cstate->cur_relname,
! 					   cstate->cur_lineno, cstate->cur_attname);
  		}
  		else
  		{
***************
*** 1604,1611 ****
  				char	   *lineval;
  
  				lineval = limit_printout_length(cstate->line_buf.data);
! 				errcontext("COPY %s, line %d: \"%s\"",
! 						   cstate->cur_relname, cstate->cur_lineno, lineval);
  				pfree(lineval);
  			}
  			else
--- 1606,1614 ----
  				char	   *lineval;
  
  				lineval = limit_printout_length(cstate->line_buf.data);
! 				errcontext("COPY %s.%s, line %d: \"%s\"",
! 						   cstate->cur_schemaname, cstate->cur_relname,
! 						   cstate->cur_lineno, lineval);
  				pfree(lineval);
  			}
  			else
***************
*** 1618,1625 ****
  				 * regurgitate it without conversion.  So we have to punt and
  				 * just report the line number.
  				 */
! 				errcontext("COPY %s, line %d",
! 						   cstate->cur_relname, cstate->cur_lineno);
  			}
  		}
  	}
--- 1621,1629 ----
  				 * regurgitate it without conversion.  So we have to punt and
  				 * just report the line number.
  				 */
! 				errcontext("COPY %s.%s, line %d",
! 						   cstate->cur_schemaname, cstate->cur_relname,
! 						   cstate->cur_lineno);
  			}
  		}
  	}
***************
*** 1929,1934 ****
--- 1933,1939 ----
  	/* Initialize state variables */
  	cstate->fe_eof = false;
  	cstate->eol_type = EOL_UNKNOWN;
+ 	cstate->cur_schemaname = get_namespace_name(RelationGetNamespace(cstate->rel));
  	cstate->cur_relname = RelationGetRelationName(cstate->rel);
  	cstate->cur_lineno = 0;
  	cstate->cur_attname = NULL;
Index: src/test/regress/expected/alter_table.out
===================================================================
RCS file: /projects/cvsroot/pgsql/src/test/regress/expected/alter_table.out,v
retrieving revision 1.119
diff -c -r1.119 alter_table.out
*** src/test/regress/expected/alter_table.out	23 Dec 2009 02:35:24 -0000	1.119
--- src/test/regress/expected/alter_table.out	2 May 2010 15:40:52 -0000
***************
*** 998,1004 ****
  ERROR:  column "........pg.dropped.1........" of relation "test" does not exist
  copy test from stdin;
  ERROR:  extra data after last expected column
! CONTEXT:  COPY test, line 1: "10	11	12"
  select * from test;
   b | c 
  ---+---
--- 998,1004 ----
  ERROR:  column "........pg.dropped.1........" of relation "test" does not exist
  copy test from stdin;
  ERROR:  extra data after last expected column
! CONTEXT:  COPY public.test, line 1: "10	11	12"
  select * from test;
   b | c 
  ---+---
Index: src/test/regress/expected/copy2.out
===================================================================
RCS file: /projects/cvsroot/pgsql/src/test/regress/expected/copy2.out,v
retrieving revision 1.29
diff -c -r1.29 copy2.out
*** src/test/regress/expected/copy2.out	17 Feb 2010 04:19:41 -0000	1.29
--- src/test/regress/expected/copy2.out	2 May 2010 15:40:52 -0000
***************
*** 1,4 ****
! CREATE TEMP TABLE x (
  	a serial,
  	b int,
  	c text not null default 'stuff',
--- 1,4 ----
! CREATE TABLE public.x (
  	a serial,
  	b int,
  	c text not null default 'stuff',
***************
*** 35,51 ****
  -- missing data: should fail
  COPY x from stdin;
  ERROR:  invalid input syntax for integer: ""
! CONTEXT:  COPY x, line 1, column a: ""
  COPY x from stdin;
  ERROR:  missing data for column "e"
! CONTEXT:  COPY x, line 1: "2000	230	23	23"
  COPY x from stdin;
  ERROR:  missing data for column "e"
! CONTEXT:  COPY x, line 1: "2001	231	\N	\N"
  -- extra data: should fail
  COPY x from stdin;
  ERROR:  extra data after last expected column
! CONTEXT:  COPY x, line 1: "2002	232	40	50	60	70	80"
  -- various COPY options: delimiters, oids, NULL string
  COPY x (b, c, d, e) from stdin with oids delimiter ',' null 'x';
  COPY x from stdin WITH DELIMITER AS ';' NULL AS '';
--- 35,51 ----
  -- missing data: should fail
  COPY x from stdin;
  ERROR:  invalid input syntax for integer: ""
! CONTEXT:  COPY public.x, line 1, column a: ""
  COPY x from stdin;
  ERROR:  missing data for column "e"
! CONTEXT:  COPY public.x, line 1: "2000	230	23	23"
  COPY x from stdin;
  ERROR:  missing data for column "e"
! CONTEXT:  COPY public.x, line 1: "2001	231	\N	\N"
  -- extra data: should fail
  COPY x from stdin;
  ERROR:  extra data after last expected column
! CONTEXT:  COPY public.x, line 1: "2002	232	40	50	60	70	80"
  -- various COPY options: delimiters, oids, NULL string
  COPY x (b, c, d, e) from stdin with oids delimiter ',' null 'x';
  COPY x from stdin WITH DELIMITER AS ';' NULL AS '';
Index: src/test/regress/expected/domain.out
===================================================================
RCS file: /projects/cvsroot/pgsql/src/test/regress/expected/domain.out,v
retrieving revision 1.45
diff -c -r1.45 domain.out
*** src/test/regress/expected/domain.out	11 Jun 2008 21:53:49 -0000	1.45
--- src/test/regress/expected/domain.out	2 May 2010 15:40:52 -0000
***************
*** 49,55 ****
  -- Test copy
  COPY basictest (testvarchar) FROM stdin; -- fail
  ERROR:  value too long for type character varying(5)
! CONTEXT:  COPY basictest, line 1, column testvarchar: "notsoshorttext"
  COPY basictest (testvarchar) FROM stdin;
  select * from basictest;
   testint4 | testtext | testvarchar | testnumeric 
--- 49,55 ----
  -- Test copy
  COPY basictest (testvarchar) FROM stdin; -- fail
  ERROR:  value too long for type character varying(5)
! CONTEXT:  COPY public.basictest, line 1, column testvarchar: "notsoshorttext"
  COPY basictest (testvarchar) FROM stdin;
  select * from basictest;
   testint4 | testtext | testvarchar | testnumeric 
***************
*** 130,136 ****
  COPY domarrtest FROM stdin;
  COPY domarrtest FROM stdin;	-- fail
  ERROR:  value too long for type character varying(4)
! CONTEXT:  COPY domarrtest, line 1, column testchar4arr: "{qwerty,w,e}"
  select * from domarrtest;
    testint4arr  |    testchar4arr     
  ---------------+---------------------
--- 130,136 ----
  COPY domarrtest FROM stdin;
  COPY domarrtest FROM stdin;	-- fail
  ERROR:  value too long for type character varying(4)
! CONTEXT:  COPY public.domarrtest, line 1, column testchar4arr: "{qwerty,w,e}"
  select * from domarrtest;
    testint4arr  |    testchar4arr     
  ---------------+---------------------
***************
*** 173,186 ****
  -- Test copy
  COPY nulltest FROM stdin; --fail
  ERROR:  null value in column "col3" violates not-null constraint
! CONTEXT:  COPY nulltest, line 1: "a	b	\N	d	d"
  COPY nulltest FROM stdin; --fail
  ERROR:  domain dcheck does not allow null values
! CONTEXT:  COPY nulltest, line 1, column col5: null input
  -- Last row is bad
  COPY nulltest FROM stdin;
  ERROR:  new row for relation "nulltest" violates check constraint "nulltest_col5_check"
! CONTEXT:  COPY nulltest, line 3: "a	b	c	\N	a"
  select * from nulltest;
   col1 | col2 | col3 | col4 | col5 
  ------+------+------+------+------
--- 173,186 ----
  -- Test copy
  COPY nulltest FROM stdin; --fail
  ERROR:  null value in column "col3" violates not-null constraint
! CONTEXT:  COPY public.nulltest, line 1: "a	b	\N	d	d"
  COPY nulltest FROM stdin; --fail
  ERROR:  domain dcheck does not allow null values
! CONTEXT:  COPY public.nulltest, line 1, column col5: null input
  -- Last row is bad
  COPY nulltest FROM stdin;
  ERROR:  new row for relation "nulltest" violates check constraint "nulltest_col5_check"
! CONTEXT:  COPY public.nulltest, line 3: "a	b	c	\N	a"
  select * from nulltest;
   col1 | col2 | col3 | col4 | col5 
  ------+------+------+------+------
Index: src/test/regress/output/constraints.source
===================================================================
RCS file: /projects/cvsroot/pgsql/src/test/regress/output/constraints.source,v
retrieving revision 1.49
diff -c -r1.49 constraints.source
*** src/test/regress/output/constraints.source	22 Mar 2010 17:43:28 -0000	1.49
--- src/test/regress/output/constraints.source	2 May 2010 15:40:52 -0000
***************
*** 278,284 ****
  
  COPY COPY_TBL FROM '@abs_srcdir@/data/constrf.data';
  ERROR:  new row for relation "copy_tbl" violates check constraint "copy_con"
! CONTEXT:  COPY copy_tbl, line 2: "7	check failed	6"
  SELECT * FROM COPY_TBL;
   x |       y       | z 
  ---+---------------+---
--- 278,284 ----
  
  COPY COPY_TBL FROM '@abs_srcdir@/data/constrf.data';
  ERROR:  new row for relation "copy_tbl" violates check constraint "copy_con"
! CONTEXT:  COPY public.copy_tbl, line 2: "7	check failed	6"
  SELECT * FROM COPY_TBL;
   x |       y       | z 
  ---+---------------+---
Index: src/test/regress/sql/copy2.sql
===================================================================
RCS file: /projects/cvsroot/pgsql/src/test/regress/sql/copy2.sql,v
retrieving revision 1.20
diff -c -r1.20 copy2.sql
*** src/test/regress/sql/copy2.sql	17 Feb 2010 04:19:41 -0000	1.20
--- src/test/regress/sql/copy2.sql	2 May 2010 15:40:52 -0000
***************
*** 1,4 ****
! CREATE TEMP TABLE x (
  	a serial,
  	b int,
  	c text not null default 'stuff',
--- 1,4 ----
! CREATE TABLE public.x (
  	a serial,
  	b int,
  	c text not null default 'stuff',