mirror of
https://github.com/postgres/postgres.git
synced 2025-09-02 04:21:28 +03:00
Support "OR condition ..." in plpgsql EXCEPTION clauses to make the syntax
more nearly Oracle-equivalent. Allow matching by category as well as specific error code. Document the set of available condition names (or more accurately, synchronize it with the existing documentation). In passing, update errcodes.sgml to include codes added during 7.5 development.
This commit is contained in:
@@ -4,7 +4,7 @@
|
||||
* procedural language
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/pl/plpgsql/src/gram.y,v 1.58 2004/07/31 07:39:20 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/pl/plpgsql/src/gram.y,v 1.59 2004/07/31 23:04:56 tgl Exp $
|
||||
*
|
||||
* This software is copyrighted by Jan Wieck - Hamburg.
|
||||
*
|
||||
@@ -96,6 +96,7 @@ static void check_assignable(PLpgSQL_datum *datum);
|
||||
PLpgSQL_stmt *stmt;
|
||||
PLpgSQL_stmts *stmts;
|
||||
PLpgSQL_stmt_block *program;
|
||||
PLpgSQL_condition *condition;
|
||||
PLpgSQL_exception *exception;
|
||||
PLpgSQL_exceptions *exceptions;
|
||||
PLpgSQL_nsitem *nsitem;
|
||||
@@ -135,6 +136,7 @@ static void check_assignable(PLpgSQL_datum *datum);
|
||||
|
||||
%type <exceptions> exception_sect proc_exceptions
|
||||
%type <exception> proc_exception
|
||||
%type <condition> proc_conditions
|
||||
|
||||
%type <intlist> raise_params
|
||||
%type <ival> raise_level raise_param
|
||||
@@ -181,6 +183,7 @@ static void check_assignable(PLpgSQL_datum *datum);
|
||||
%token K_NOTICE
|
||||
%token K_NULL
|
||||
%token K_OPEN
|
||||
%token K_OR
|
||||
%token K_PERFORM
|
||||
%token K_ROW_COUNT
|
||||
%token K_RAISE
|
||||
@@ -1563,21 +1566,52 @@ proc_exceptions : proc_exceptions proc_exception
|
||||
}
|
||||
;
|
||||
|
||||
proc_exception : K_WHEN lno opt_lblname K_THEN proc_sect
|
||||
proc_exception : K_WHEN lno proc_conditions K_THEN proc_sect
|
||||
{
|
||||
PLpgSQL_exception *new;
|
||||
|
||||
new = malloc(sizeof(PLpgSQL_exception));
|
||||
memset(new, 0, sizeof(PLpgSQL_exception));
|
||||
|
||||
new->lineno = $2;
|
||||
new->label = $3;
|
||||
new->action = $5;
|
||||
new->lineno = $2;
|
||||
new->conditions = $3;
|
||||
new->action = $5;
|
||||
|
||||
$$ = new;
|
||||
}
|
||||
;
|
||||
|
||||
proc_conditions : proc_conditions K_OR opt_lblname
|
||||
{
|
||||
PLpgSQL_condition *new;
|
||||
PLpgSQL_condition *old;
|
||||
|
||||
new = malloc(sizeof(PLpgSQL_condition));
|
||||
memset(new, 0, sizeof(PLpgSQL_condition));
|
||||
|
||||
new->condname = $3;
|
||||
new->next = NULL;
|
||||
|
||||
for (old = $1; old->next != NULL; old = old->next)
|
||||
/* skip */ ;
|
||||
old->next = new;
|
||||
|
||||
$$ = $1;
|
||||
}
|
||||
| opt_lblname
|
||||
{
|
||||
PLpgSQL_condition *new;
|
||||
|
||||
new = malloc(sizeof(PLpgSQL_condition));
|
||||
memset(new, 0, sizeof(PLpgSQL_condition));
|
||||
|
||||
new->condname = $1;
|
||||
new->next = NULL;
|
||||
|
||||
$$ = new;
|
||||
}
|
||||
;
|
||||
|
||||
expr_until_semi :
|
||||
{ $$ = plpgsql_read_expression(';', ";"); }
|
||||
;
|
||||
|
@@ -3,7 +3,7 @@
|
||||
* procedural language
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.110 2004/07/31 20:55:44 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.111 2004/07/31 23:04:56 tgl Exp $
|
||||
*
|
||||
* This software is copyrighted by Jan Wieck - Hamburg.
|
||||
*
|
||||
@@ -795,27 +795,45 @@ copy_rec(PLpgSQL_rec * rec)
|
||||
|
||||
|
||||
static bool
|
||||
exception_matches_label(ErrorData *edata, const char *label)
|
||||
exception_matches_conditions(ErrorData *edata, PLpgSQL_condition *cond)
|
||||
{
|
||||
int i;
|
||||
for (; cond != NULL; cond = cond->next)
|
||||
{
|
||||
const char *condname = cond->condname;
|
||||
int i;
|
||||
|
||||
/*
|
||||
* OTHERS matches everything *except* query-canceled;
|
||||
* if you're foolish enough, you can match that explicitly.
|
||||
*/
|
||||
if (pg_strcasecmp(label, "OTHERS") == 0)
|
||||
{
|
||||
if (edata->sqlerrcode == ERRCODE_QUERY_CANCELED)
|
||||
return false;
|
||||
else
|
||||
return true;
|
||||
/*
|
||||
* OTHERS matches everything *except* query-canceled;
|
||||
* if you're foolish enough, you can match that explicitly.
|
||||
*/
|
||||
if (pg_strcasecmp(condname, "OTHERS") == 0)
|
||||
{
|
||||
if (edata->sqlerrcode == ERRCODE_QUERY_CANCELED)
|
||||
return false;
|
||||
else
|
||||
return true;
|
||||
}
|
||||
for (i = 0; exception_label_map[i].label != NULL; i++)
|
||||
{
|
||||
if (pg_strcasecmp(condname, exception_label_map[i].label) == 0)
|
||||
{
|
||||
int labelerrcode = exception_label_map[i].sqlerrstate;
|
||||
|
||||
/* Exact match? */
|
||||
if (edata->sqlerrcode == labelerrcode)
|
||||
return true;
|
||||
/* Category match? */
|
||||
if (ERRCODE_IS_CATEGORY(labelerrcode) &&
|
||||
ERRCODE_TO_CATEGORY(edata->sqlerrcode) == labelerrcode)
|
||||
return true;
|
||||
/*
|
||||
* You would think we should "break" here, but there are some
|
||||
* duplicate names in the table, so keep looking.
|
||||
*/
|
||||
}
|
||||
}
|
||||
/* Should we raise an error if condname is unrecognized?? */
|
||||
}
|
||||
for (i = 0; exception_label_map[i].label != NULL; i++)
|
||||
{
|
||||
if (pg_strcasecmp(label, exception_label_map[i].label) == 0)
|
||||
return (edata->sqlerrcode == exception_label_map[i].sqlerrstate);
|
||||
}
|
||||
/* Should we raise an error if label is unrecognized?? */
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -944,7 +962,7 @@ exec_stmt_block(PLpgSQL_execstate * estate, PLpgSQL_stmt_block * block)
|
||||
{
|
||||
PLpgSQL_exception *exception = exceptions->exceptions[j];
|
||||
|
||||
if (exception_matches_label(edata, exception->label))
|
||||
if (exception_matches_conditions(edata, exception->conditions))
|
||||
{
|
||||
rc = exec_stmts(estate, exception->action);
|
||||
break;
|
||||
|
@@ -3,7 +3,7 @@
|
||||
* procedural language
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_funcs.c,v 1.33 2004/07/31 07:39:20 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_funcs.c,v 1.34 2004/07/31 23:04:56 tgl Exp $
|
||||
*
|
||||
* This software is copyrighted by Jan Wieck - Hamburg.
|
||||
*
|
||||
@@ -615,9 +615,17 @@ dump_block(PLpgSQL_stmt_block * block)
|
||||
for (i = 0; i < block->exceptions->exceptions_used; i++)
|
||||
{
|
||||
PLpgSQL_exception *exc = block->exceptions->exceptions[i];
|
||||
PLpgSQL_condition *cond;
|
||||
|
||||
dump_ind();
|
||||
printf(" EXCEPTION WHEN %s THEN\n", exc->label);
|
||||
printf(" EXCEPTION WHEN ");
|
||||
for (cond = exc->conditions; cond; cond = cond->next)
|
||||
{
|
||||
if (cond != exc->conditions)
|
||||
printf(" OR ");
|
||||
printf("%s", cond->condname);
|
||||
}
|
||||
printf(" THEN\n");
|
||||
dump_stmts(exc->action);
|
||||
}
|
||||
}
|
||||
|
@@ -9,22 +9,12 @@
|
||||
*
|
||||
* Copyright (c) 2003, PostgreSQL Global Development Group
|
||||
*
|
||||
* $PostgreSQL: pgsql/src/pl/plpgsql/src/plerrcodes.h,v 1.1 2004/07/31 07:39:20 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/pl/plpgsql/src/plerrcodes.h,v 1.2 2004/07/31 23:04:56 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
{ "SUCCESSFUL_COMPLETION", ERRCODE_SUCCESSFUL_COMPLETION },
|
||||
{ "WARNING", ERRCODE_WARNING },
|
||||
{ "WARNING_DYNAMIC_RESULT_SETS_RETURNED", ERRCODE_WARNING_DYNAMIC_RESULT_SETS_RETURNED },
|
||||
{ "WARNING_IMPLICIT_ZERO_BIT_PADDING", ERRCODE_WARNING_IMPLICIT_ZERO_BIT_PADDING },
|
||||
{ "WARNING_NULL_VALUE_ELIMINATED_IN_SET_FUNCTION", ERRCODE_WARNING_NULL_VALUE_ELIMINATED_IN_SET_FUNCTION },
|
||||
{ "WARNING_PRIVILEGE_NOT_GRANTED", ERRCODE_WARNING_PRIVILEGE_NOT_GRANTED },
|
||||
{ "WARNING_PRIVILEGE_NOT_REVOKED", ERRCODE_WARNING_PRIVILEGE_NOT_REVOKED },
|
||||
{ "WARNING_STRING_DATA_RIGHT_TRUNCATION", ERRCODE_WARNING_STRING_DATA_RIGHT_TRUNCATION },
|
||||
{ "WARNING_DEPRECATED_FEATURE", ERRCODE_WARNING_DEPRECATED_FEATURE },
|
||||
{ "NO_DATA", ERRCODE_NO_DATA },
|
||||
{ "NO_ADDITIONAL_DYNAMIC_RESULT_SETS_RETURNED", ERRCODE_NO_ADDITIONAL_DYNAMIC_RESULT_SETS_RETURNED },
|
||||
/* Success and warnings can't be caught, so omit them from table */
|
||||
{ "SQL_STATEMENT_NOT_YET_COMPLETE", ERRCODE_SQL_STATEMENT_NOT_YET_COMPLETE },
|
||||
{ "CONNECTION_EXCEPTION", ERRCODE_CONNECTION_EXCEPTION },
|
||||
{ "CONNECTION_DOES_NOT_EXIST", ERRCODE_CONNECTION_DOES_NOT_EXIST },
|
||||
@@ -37,7 +27,7 @@
|
||||
{ "FEATURE_NOT_SUPPORTED", ERRCODE_FEATURE_NOT_SUPPORTED },
|
||||
{ "INVALID_TRANSACTION_INITIATION", ERRCODE_INVALID_TRANSACTION_INITIATION },
|
||||
{ "LOCATOR_EXCEPTION", ERRCODE_LOCATOR_EXCEPTION },
|
||||
{ "L_E_INVALID_SPECIFICATION", ERRCODE_L_E_INVALID_SPECIFICATION },
|
||||
{ "INVALID_LOCATOR_SPECIFICATION", ERRCODE_L_E_INVALID_SPECIFICATION },
|
||||
{ "INVALID_GRANTOR", ERRCODE_INVALID_GRANTOR },
|
||||
{ "INVALID_GRANT_OPERATION", ERRCODE_INVALID_GRANT_OPERATION },
|
||||
{ "INVALID_ROLE_SPECIFICATION", ERRCODE_INVALID_ROLE_SPECIFICATION },
|
||||
@@ -53,7 +43,7 @@
|
||||
{ "ESCAPE_CHARACTER_CONFLICT", ERRCODE_ESCAPE_CHARACTER_CONFLICT },
|
||||
{ "INDICATOR_OVERFLOW", ERRCODE_INDICATOR_OVERFLOW },
|
||||
{ "INTERVAL_FIELD_OVERFLOW", ERRCODE_INTERVAL_FIELD_OVERFLOW },
|
||||
{ "INVALID_ARGUMENT_FOR_LOG", ERRCODE_INVALID_ARGUMENT_FOR_LOG },
|
||||
{ "INVALID_ARGUMENT_FOR_LOGARITHM", ERRCODE_INVALID_ARGUMENT_FOR_LOG },
|
||||
{ "INVALID_ARGUMENT_FOR_POWER_FUNCTION", ERRCODE_INVALID_ARGUMENT_FOR_POWER_FUNCTION },
|
||||
{ "INVALID_ARGUMENT_FOR_WIDTH_BUCKET_FUNCTION", ERRCODE_INVALID_ARGUMENT_FOR_WIDTH_BUCKET_FUNCTION },
|
||||
{ "INVALID_CHARACTER_VALUE_FOR_CAST", ERRCODE_INVALID_CHARACTER_VALUE_FOR_CAST },
|
||||
@@ -107,30 +97,30 @@
|
||||
{ "DEPENDENT_OBJECTS_STILL_EXIST", ERRCODE_DEPENDENT_OBJECTS_STILL_EXIST },
|
||||
{ "INVALID_TRANSACTION_TERMINATION", ERRCODE_INVALID_TRANSACTION_TERMINATION },
|
||||
{ "SQL_ROUTINE_EXCEPTION", ERRCODE_SQL_ROUTINE_EXCEPTION },
|
||||
{ "S_R_E_FUNCTION_EXECUTED_NO_RETURN_STATEMENT", ERRCODE_S_R_E_FUNCTION_EXECUTED_NO_RETURN_STATEMENT },
|
||||
{ "S_R_E_MODIFYING_SQL_DATA_NOT_PERMITTED", ERRCODE_S_R_E_MODIFYING_SQL_DATA_NOT_PERMITTED },
|
||||
{ "S_R_E_PROHIBITED_SQL_STATEMENT_ATTEMPTED", ERRCODE_S_R_E_PROHIBITED_SQL_STATEMENT_ATTEMPTED },
|
||||
{ "S_R_E_READING_SQL_DATA_NOT_PERMITTED", ERRCODE_S_R_E_READING_SQL_DATA_NOT_PERMITTED },
|
||||
{ "FUNCTION_EXECUTED_NO_RETURN_STATEMENT", ERRCODE_S_R_E_FUNCTION_EXECUTED_NO_RETURN_STATEMENT },
|
||||
{ "MODIFYING_SQL_DATA_NOT_PERMITTED", ERRCODE_S_R_E_MODIFYING_SQL_DATA_NOT_PERMITTED },
|
||||
{ "PROHIBITED_SQL_STATEMENT_ATTEMPTED", ERRCODE_S_R_E_PROHIBITED_SQL_STATEMENT_ATTEMPTED },
|
||||
{ "READING_SQL_DATA_NOT_PERMITTED", ERRCODE_S_R_E_READING_SQL_DATA_NOT_PERMITTED },
|
||||
{ "INVALID_CURSOR_NAME", ERRCODE_INVALID_CURSOR_NAME },
|
||||
{ "EXTERNAL_ROUTINE_EXCEPTION", ERRCODE_EXTERNAL_ROUTINE_EXCEPTION },
|
||||
{ "E_R_E_CONTAINING_SQL_NOT_PERMITTED", ERRCODE_E_R_E_CONTAINING_SQL_NOT_PERMITTED },
|
||||
{ "E_R_E_MODIFYING_SQL_DATA_NOT_PERMITTED", ERRCODE_E_R_E_MODIFYING_SQL_DATA_NOT_PERMITTED },
|
||||
{ "E_R_E_PROHIBITED_SQL_STATEMENT_ATTEMPTED", ERRCODE_E_R_E_PROHIBITED_SQL_STATEMENT_ATTEMPTED },
|
||||
{ "E_R_E_READING_SQL_DATA_NOT_PERMITTED", ERRCODE_E_R_E_READING_SQL_DATA_NOT_PERMITTED },
|
||||
{ "CONTAINING_SQL_NOT_PERMITTED", ERRCODE_E_R_E_CONTAINING_SQL_NOT_PERMITTED },
|
||||
{ "MODIFYING_SQL_DATA_NOT_PERMITTED", ERRCODE_E_R_E_MODIFYING_SQL_DATA_NOT_PERMITTED },
|
||||
{ "PROHIBITED_SQL_STATEMENT_ATTEMPTED", ERRCODE_E_R_E_PROHIBITED_SQL_STATEMENT_ATTEMPTED },
|
||||
{ "READING_SQL_DATA_NOT_PERMITTED", ERRCODE_E_R_E_READING_SQL_DATA_NOT_PERMITTED },
|
||||
{ "EXTERNAL_ROUTINE_INVOCATION_EXCEPTION", ERRCODE_EXTERNAL_ROUTINE_INVOCATION_EXCEPTION },
|
||||
{ "E_R_I_E_INVALID_SQLSTATE_RETURNED", ERRCODE_E_R_I_E_INVALID_SQLSTATE_RETURNED },
|
||||
{ "E_R_I_E_NULL_VALUE_NOT_ALLOWED", ERRCODE_E_R_I_E_NULL_VALUE_NOT_ALLOWED },
|
||||
{ "E_R_I_E_TRIGGER_PROTOCOL_VIOLATED", ERRCODE_E_R_I_E_TRIGGER_PROTOCOL_VIOLATED },
|
||||
{ "E_R_I_E_SRF_PROTOCOL_VIOLATED", ERRCODE_E_R_I_E_SRF_PROTOCOL_VIOLATED },
|
||||
{ "INVALID_SQLSTATE_RETURNED", ERRCODE_E_R_I_E_INVALID_SQLSTATE_RETURNED },
|
||||
{ "NULL_VALUE_NOT_ALLOWED", ERRCODE_E_R_I_E_NULL_VALUE_NOT_ALLOWED },
|
||||
{ "TRIGGER_PROTOCOL_VIOLATED", ERRCODE_E_R_I_E_TRIGGER_PROTOCOL_VIOLATED },
|
||||
{ "SRF_PROTOCOL_VIOLATED", ERRCODE_E_R_I_E_SRF_PROTOCOL_VIOLATED },
|
||||
{ "SAVEPOINT_EXCEPTION", ERRCODE_SAVEPOINT_EXCEPTION },
|
||||
{ "S_E_INVALID_SPECIFICATION", ERRCODE_S_E_INVALID_SPECIFICATION },
|
||||
{ "INVALID_SAVEPOINT_SPECIFICATION", ERRCODE_S_E_INVALID_SPECIFICATION },
|
||||
{ "INVALID_CATALOG_NAME", ERRCODE_INVALID_CATALOG_NAME },
|
||||
{ "INVALID_SCHEMA_NAME", ERRCODE_INVALID_SCHEMA_NAME },
|
||||
{ "TRANSACTION_ROLLBACK", ERRCODE_TRANSACTION_ROLLBACK },
|
||||
{ "T_R_INTEGRITY_CONSTRAINT_VIOLATION", ERRCODE_T_R_INTEGRITY_CONSTRAINT_VIOLATION },
|
||||
{ "T_R_SERIALIZATION_FAILURE", ERRCODE_T_R_SERIALIZATION_FAILURE },
|
||||
{ "T_R_STATEMENT_COMPLETION_UNKNOWN", ERRCODE_T_R_STATEMENT_COMPLETION_UNKNOWN },
|
||||
{ "T_R_DEADLOCK_DETECTED", ERRCODE_T_R_DEADLOCK_DETECTED },
|
||||
{ "TRANSACTION_INTEGRITY_CONSTRAINT_VIOLATION", ERRCODE_T_R_INTEGRITY_CONSTRAINT_VIOLATION },
|
||||
{ "SERIALIZATION_FAILURE", ERRCODE_T_R_SERIALIZATION_FAILURE },
|
||||
{ "STATEMENT_COMPLETION_UNKNOWN", ERRCODE_T_R_STATEMENT_COMPLETION_UNKNOWN },
|
||||
{ "DEADLOCK_DETECTED", ERRCODE_T_R_DEADLOCK_DETECTED },
|
||||
{ "SYNTAX_ERROR_OR_ACCESS_RULE_VIOLATION", ERRCODE_SYNTAX_ERROR_OR_ACCESS_RULE_VIOLATION },
|
||||
{ "SYNTAX_ERROR", ERRCODE_SYNTAX_ERROR },
|
||||
{ "INSUFFICIENT_PRIVILEGE", ERRCODE_INSUFFICIENT_PRIVILEGE },
|
||||
@@ -156,7 +146,7 @@
|
||||
{ "DUPLICATE_CURSOR", ERRCODE_DUPLICATE_CURSOR },
|
||||
{ "DUPLICATE_DATABASE", ERRCODE_DUPLICATE_DATABASE },
|
||||
{ "DUPLICATE_FUNCTION", ERRCODE_DUPLICATE_FUNCTION },
|
||||
{ "DUPLICATE_PSTATEMENT", ERRCODE_DUPLICATE_PSTATEMENT },
|
||||
{ "DUPLICATE_PREPARED_STATEMENT", ERRCODE_DUPLICATE_PSTATEMENT },
|
||||
{ "DUPLICATE_SCHEMA", ERRCODE_DUPLICATE_SCHEMA },
|
||||
{ "DUPLICATE_TABLE", ERRCODE_DUPLICATE_TABLE },
|
||||
{ "DUPLICATE_ALIAS", ERRCODE_DUPLICATE_ALIAS },
|
||||
@@ -170,7 +160,7 @@
|
||||
{ "INVALID_CURSOR_DEFINITION", ERRCODE_INVALID_CURSOR_DEFINITION },
|
||||
{ "INVALID_DATABASE_DEFINITION", ERRCODE_INVALID_DATABASE_DEFINITION },
|
||||
{ "INVALID_FUNCTION_DEFINITION", ERRCODE_INVALID_FUNCTION_DEFINITION },
|
||||
{ "INVALID_PSTATEMENT_DEFINITION", ERRCODE_INVALID_PSTATEMENT_DEFINITION },
|
||||
{ "INVALID_PREPARED_STATEMENT_DEFINITION", ERRCODE_INVALID_PSTATEMENT_DEFINITION },
|
||||
{ "INVALID_SCHEMA_DEFINITION", ERRCODE_INVALID_SCHEMA_DEFINITION },
|
||||
{ "INVALID_TABLE_DEFINITION", ERRCODE_INVALID_TABLE_DEFINITION },
|
||||
{ "INVALID_OBJECT_DEFINITION", ERRCODE_INVALID_OBJECT_DEFINITION },
|
||||
|
@@ -3,7 +3,7 @@
|
||||
* procedural language
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/pl/plpgsql/src/plpgsql.h,v 1.48 2004/07/31 07:39:20 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/pl/plpgsql/src/plpgsql.h,v 1.49 2004/07/31 23:04:56 tgl Exp $
|
||||
*
|
||||
* This software is copyrighted by Jan Wieck - Hamburg.
|
||||
*
|
||||
@@ -322,10 +322,16 @@ typedef struct
|
||||
} PLpgSQL_stmts;
|
||||
|
||||
|
||||
typedef struct PLpgSQL_condition
|
||||
{ /* One EXCEPTION condition name */
|
||||
char *condname;
|
||||
struct PLpgSQL_condition *next;
|
||||
} PLpgSQL_condition;
|
||||
|
||||
typedef struct
|
||||
{ /* One EXCEPTION ... WHEN clause */
|
||||
int lineno;
|
||||
char *label;
|
||||
PLpgSQL_condition *conditions;
|
||||
PLpgSQL_stmts *action;
|
||||
} PLpgSQL_exception;
|
||||
|
||||
|
@@ -4,7 +4,7 @@
|
||||
* procedural language
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/pl/plpgsql/src/scan.l,v 1.35 2004/06/03 22:56:43 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/pl/plpgsql/src/scan.l,v 1.36 2004/07/31 23:04:56 tgl Exp $
|
||||
*
|
||||
* This software is copyrighted by Jan Wieck - Hamburg.
|
||||
*
|
||||
@@ -165,6 +165,7 @@ not { return K_NOT; }
|
||||
notice { return K_NOTICE; }
|
||||
null { return K_NULL; }
|
||||
open { return K_OPEN; }
|
||||
or { return K_OR; }
|
||||
perform { return K_PERFORM; }
|
||||
raise { return K_RAISE; }
|
||||
rename { return K_RENAME; }
|
||||
|
Reference in New Issue
Block a user