mirror of
https://github.com/postgres/postgres.git
synced 2025-07-07 00:36:50 +03:00
Rename COPY option from SAVE_ERROR_TO to ON_ERROR
The option names now are "stop" (default) and "ignore". The future options could be "file 'filename.log'" and "table 'tablename'". Discussion: https://postgr.es/m/20240117.164859.2242646601795501168.horikyota.ntt%40gmail.com Author: Jian He Reviewed-by: Atsushi Torikoshi
This commit is contained in:
@ -395,39 +395,39 @@ defGetCopyHeaderChoice(DefElem *def, bool is_from)
|
||||
}
|
||||
|
||||
/*
|
||||
* Extract a CopySaveErrorToChoice value from a DefElem.
|
||||
* Extract a CopyOnErrorChoice value from a DefElem.
|
||||
*/
|
||||
static CopySaveErrorToChoice
|
||||
defGetCopySaveErrorToChoice(DefElem *def, ParseState *pstate, bool is_from)
|
||||
static CopyOnErrorChoice
|
||||
defGetCopyOnErrorChoice(DefElem *def, ParseState *pstate, bool is_from)
|
||||
{
|
||||
char *sval;
|
||||
|
||||
if (!is_from)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
|
||||
errmsg("COPY SAVE_ERROR_TO cannot be used with COPY TO"),
|
||||
errmsg("COPY ON_ERROR cannot be used with COPY TO"),
|
||||
parser_errposition(pstate, def->location)));
|
||||
|
||||
/*
|
||||
* If no parameter value given, assume the default value.
|
||||
*/
|
||||
if (def->arg == NULL)
|
||||
return COPY_SAVE_ERROR_TO_ERROR;
|
||||
return COPY_ON_ERROR_STOP;
|
||||
|
||||
/*
|
||||
* Allow "error", or "none" values.
|
||||
* Allow "stop", or "ignore" values.
|
||||
*/
|
||||
sval = defGetString(def);
|
||||
if (pg_strcasecmp(sval, "error") == 0)
|
||||
return COPY_SAVE_ERROR_TO_ERROR;
|
||||
if (pg_strcasecmp(sval, "none") == 0)
|
||||
return COPY_SAVE_ERROR_TO_NONE;
|
||||
if (pg_strcasecmp(sval, "stop") == 0)
|
||||
return COPY_ON_ERROR_STOP;
|
||||
if (pg_strcasecmp(sval, "ignore") == 0)
|
||||
return COPY_ON_ERROR_IGNORE;
|
||||
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
|
||||
errmsg("COPY save_error_to \"%s\" not recognized", sval),
|
||||
errmsg("COPY ON_ERROR \"%s\" not recognized", sval),
|
||||
parser_errposition(pstate, def->location)));
|
||||
return COPY_SAVE_ERROR_TO_ERROR; /* keep compiler quiet */
|
||||
return COPY_ON_ERROR_STOP; /* keep compiler quiet */
|
||||
}
|
||||
|
||||
/*
|
||||
@ -455,7 +455,7 @@ ProcessCopyOptions(ParseState *pstate,
|
||||
bool format_specified = false;
|
||||
bool freeze_specified = false;
|
||||
bool header_specified = false;
|
||||
bool save_error_to_specified = false;
|
||||
bool on_error_specified = false;
|
||||
ListCell *option;
|
||||
|
||||
/* Support external use for option sanity checking */
|
||||
@ -608,12 +608,12 @@ ProcessCopyOptions(ParseState *pstate,
|
||||
defel->defname),
|
||||
parser_errposition(pstate, defel->location)));
|
||||
}
|
||||
else if (strcmp(defel->defname, "save_error_to") == 0)
|
||||
else if (strcmp(defel->defname, "on_error") == 0)
|
||||
{
|
||||
if (save_error_to_specified)
|
||||
if (on_error_specified)
|
||||
errorConflictingDefElem(defel, pstate);
|
||||
save_error_to_specified = true;
|
||||
opts_out->save_error_to = defGetCopySaveErrorToChoice(defel, pstate, is_from);
|
||||
on_error_specified = true;
|
||||
opts_out->on_error = defGetCopyOnErrorChoice(defel, pstate, is_from);
|
||||
}
|
||||
else
|
||||
ereport(ERROR,
|
||||
@ -642,10 +642,10 @@ ProcessCopyOptions(ParseState *pstate,
|
||||
(errcode(ERRCODE_SYNTAX_ERROR),
|
||||
errmsg("cannot specify DEFAULT in BINARY mode")));
|
||||
|
||||
if (opts_out->binary && opts_out->save_error_to != COPY_SAVE_ERROR_TO_ERROR)
|
||||
if (opts_out->binary && opts_out->on_error != COPY_ON_ERROR_STOP)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_SYNTAX_ERROR),
|
||||
errmsg("cannot specify SAVE_ERROR_TO in BINARY mode")));
|
||||
errmsg("only ON_ERROR STOP is allowed in BINARY mode")));
|
||||
|
||||
/* Set defaults for omitted options */
|
||||
if (!opts_out->delim)
|
||||
|
@ -657,7 +657,7 @@ CopyFrom(CopyFromState cstate)
|
||||
Assert(cstate->rel);
|
||||
Assert(list_length(cstate->range_table) == 1);
|
||||
|
||||
if (cstate->opts.save_error_to != COPY_SAVE_ERROR_TO_ERROR)
|
||||
if (cstate->opts.on_error != COPY_ON_ERROR_STOP)
|
||||
Assert(cstate->escontext);
|
||||
|
||||
/*
|
||||
@ -996,14 +996,14 @@ CopyFrom(CopyFromState cstate)
|
||||
if (!NextCopyFrom(cstate, econtext, myslot->tts_values, myslot->tts_isnull))
|
||||
break;
|
||||
|
||||
if (cstate->opts.save_error_to != COPY_SAVE_ERROR_TO_ERROR &&
|
||||
if (cstate->opts.on_error != COPY_ON_ERROR_STOP &&
|
||||
cstate->escontext->error_occurred)
|
||||
{
|
||||
/*
|
||||
* Soft error occured, skip this tuple and save error information
|
||||
* according to SAVE_ERROR_TO.
|
||||
* Soft error occured, skip this tuple and deal with error
|
||||
* information according to ON_ERROR.
|
||||
*/
|
||||
if (cstate->opts.save_error_to == COPY_SAVE_ERROR_TO_NONE)
|
||||
if (cstate->opts.on_error == COPY_ON_ERROR_IGNORE)
|
||||
|
||||
/*
|
||||
* Just make ErrorSaveContext ready for the next NextCopyFrom.
|
||||
@ -1307,7 +1307,7 @@ CopyFrom(CopyFromState cstate)
|
||||
/* Done, clean up */
|
||||
error_context_stack = errcallback.previous;
|
||||
|
||||
if (cstate->opts.save_error_to != COPY_SAVE_ERROR_TO_ERROR &&
|
||||
if (cstate->opts.on_error != COPY_ON_ERROR_STOP &&
|
||||
cstate->num_errors > 0)
|
||||
ereport(NOTICE,
|
||||
errmsg_plural("%llu row was skipped due to data type incompatibility",
|
||||
@ -1450,18 +1450,18 @@ BeginCopyFrom(ParseState *pstate,
|
||||
}
|
||||
}
|
||||
|
||||
/* Set up soft error handler for SAVE_ERROR_TO */
|
||||
if (cstate->opts.save_error_to != COPY_SAVE_ERROR_TO_ERROR)
|
||||
/* Set up soft error handler for ON_ERROR */
|
||||
if (cstate->opts.on_error != COPY_ON_ERROR_STOP)
|
||||
{
|
||||
cstate->escontext = makeNode(ErrorSaveContext);
|
||||
cstate->escontext->type = T_ErrorSaveContext;
|
||||
cstate->escontext->error_occurred = false;
|
||||
|
||||
/*
|
||||
* Currently we only support COPY_SAVE_ERROR_TO_NONE. We'll add other
|
||||
* Currently we only support COPY_ON_ERROR_IGNORE. We'll add other
|
||||
* options later
|
||||
*/
|
||||
if (cstate->opts.save_error_to == COPY_SAVE_ERROR_TO_NONE)
|
||||
if (cstate->opts.on_error == COPY_ON_ERROR_IGNORE)
|
||||
cstate->escontext->details_wanted = false;
|
||||
}
|
||||
else
|
||||
|
@ -956,7 +956,11 @@ NextCopyFrom(CopyFromState cstate, ExprContext *econtext,
|
||||
|
||||
values[m] = ExecEvalExpr(defexprs[m], econtext, &nulls[m]);
|
||||
}
|
||||
/* If SAVE_ERROR_TO is specified, skip rows with soft errors */
|
||||
|
||||
/*
|
||||
* If ON_ERROR is specified with IGNORE, skip rows with soft
|
||||
* errors
|
||||
*/
|
||||
else if (!InputFunctionCallSafe(&in_functions[m],
|
||||
string,
|
||||
typioparams[m],
|
||||
|
Reference in New Issue
Block a user