fix_file_fdw_v2.patch

text/plain

Filename: fix_file_fdw_v2.patch
Type: text/plain
Part: 0
Message: Re: Bug in SQL/MED?
diff --git a/contrib/file_fdw/file_fdw.c b/contrib/file_fdw/file_fdw.c
index 466c015..bf80568 100644
*** a/contrib/file_fdw/file_fdw.c
--- b/contrib/file_fdw/file_fdw.c
*************** file_fdw_validator(PG_FUNCTION_ARGS)
*** 215,220 ****
--- 215,231 ----
  	 */
  	ProcessCopyOptions(NULL, true, other_options);
  
+ 	/*
+ 	 * Filename is required for file_fdw foreign tables.  We must validate it
+ 	 * separately because ProcessCopyOptions() doesn't validate it.
+ 	 * We don't care whether the value is empty or not, because COPY doesn't
+ 	 * care that.
+ 	 */
+ 	if (catalog == ForeignTableRelationId && filename == NULL)
+ 		ereport(ERROR,
+ 				(errcode(ERRCODE_FDW_UNABLE_TO_CREATE_REPLY),
+ 				 errmsg("filename is required for file_fdw foreign tables")));
+ 
  	PG_RETURN_VOID();
  }
  
*************** fileGetOptions(Oid foreigntableid,
*** 286,295 ****
  		}
  		prev = lc;
  	}
  	if (*filename == NULL)
! 		ereport(ERROR,
! 				(errcode(ERRCODE_FDW_UNABLE_TO_CREATE_REPLY),
! 				 errmsg("filename is required for file_fdw foreign tables")));
  	*other_options = options;
  }
  
--- 297,311 ----
  		}
  		prev = lc;
  	}
+ 
+ 	/*
+ 	 * The requirement of filename option must have been checked by
+ 	 * file_fdw_validator at every DDL.  We check it here again just in case
+ 	 * to avoid crash caused by unexpected catalog corruption.
+ 	 */
  	if (*filename == NULL)
! 		elog(ERROR, "filename is required for file_fdw foreign tables");
! 
  	*other_options = options;
  }
  
diff --git a/contrib/file_fdw/input/file_fdw.source b/contrib/file_fdw/input/file_fdw.source
index 9ff7235..8d6dfa3 100644
*** a/contrib/file_fdw/input/file_fdw.source
--- b/contrib/file_fdw/input/file_fdw.source
*************** CREATE FOREIGN TABLE tbl () SERVER file_
*** 59,64 ****
--- 59,65 ----
  ');       -- ERROR
  CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (format 'csv', null '
  ');       -- ERROR
+ CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (format 'csv');                       -- ERROR
  
  CREATE FOREIGN TABLE agg_text (
  	a	int2,
diff --git a/contrib/file_fdw/output/file_fdw.source b/contrib/file_fdw/output/file_fdw.source
index 2ba36c9..6cc6746 100644
*** a/contrib/file_fdw/output/file_fdw.source
--- b/contrib/file_fdw/output/file_fdw.source
*************** ERROR:  COPY delimiter cannot be newline
*** 75,80 ****
--- 75,82 ----
  CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (format 'csv', null '
  ');       -- ERROR
  ERROR:  COPY null representation cannot use newline or carriage return
+ CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (format 'csv');                       -- ERROR
+ ERROR:  filename is required for file_fdw foreign tables
  CREATE FOREIGN TABLE agg_text (
  	a	int2,
  	b	float4