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