@@ -1569,11 +1569,36 @@ exec_stmt_getdiag(PLpgSQL_execstate *estate, PLpgSQL_stmt_getdiag *stmt)
1569
1569
unpack_sql_state (estate -> cur_error -> sqlerrcode ));
1570
1570
break ;
1571
1571
1572
+ case PLPGSQL_GETDIAG_COLUMN_NAME :
1573
+ exec_assign_c_string (estate , var ,
1574
+ estate -> cur_error -> column_name );
1575
+ break ;
1576
+
1577
+ case PLPGSQL_GETDIAG_CONSTRAINT_NAME :
1578
+ exec_assign_c_string (estate , var ,
1579
+ estate -> cur_error -> constraint_name );
1580
+ break ;
1581
+
1582
+ case PLPGSQL_GETDIAG_DATATYPE_NAME :
1583
+ exec_assign_c_string (estate , var ,
1584
+ estate -> cur_error -> datatype_name );
1585
+ break ;
1586
+
1572
1587
case PLPGSQL_GETDIAG_MESSAGE_TEXT :
1573
1588
exec_assign_c_string (estate , var ,
1574
1589
estate -> cur_error -> message );
1575
1590
break ;
1576
1591
1592
+ case PLPGSQL_GETDIAG_TABLE_NAME :
1593
+ exec_assign_c_string (estate , var ,
1594
+ estate -> cur_error -> table_name );
1595
+ break ;
1596
+
1597
+ case PLPGSQL_GETDIAG_SCHEMA_NAME :
1598
+ exec_assign_c_string (estate , var ,
1599
+ estate -> cur_error -> schema_name );
1600
+ break ;
1601
+
1577
1602
default :
1578
1603
elog (ERROR , "unrecognized diagnostic item kind: %d" ,
1579
1604
diag_item -> kind );
@@ -2799,6 +2824,16 @@ exec_init_tuple_store(PLpgSQL_execstate *estate)
2799
2824
estate -> rettupdesc = rsi -> expectedDesc ;
2800
2825
}
2801
2826
2827
+ #define SET_RAISE_OPTION_TEXT (opt , name ) \
2828
+ do { \
2829
+ if (opt) \
2830
+ ereport(ERROR, \
2831
+ (errcode(ERRCODE_SYNTAX_ERROR), \
2832
+ errmsg("RAISE option already specified: %s", \
2833
+ name))); \
2834
+ opt = pstrdup(extval); \
2835
+ } while (0)
2836
+
2802
2837
/* ----------
2803
2838
* exec_stmt_raise Build a message and throw it with elog()
2804
2839
* ----------
@@ -2811,6 +2846,11 @@ exec_stmt_raise(PLpgSQL_execstate *estate, PLpgSQL_stmt_raise *stmt)
2811
2846
char * err_message = NULL ;
2812
2847
char * err_detail = NULL ;
2813
2848
char * err_hint = NULL ;
2849
+ char * err_column = NULL ;
2850
+ char * err_constraint = NULL ;
2851
+ char * err_datatype = NULL ;
2852
+ char * err_table = NULL ;
2853
+ char * err_schema = NULL ;
2814
2854
ListCell * lc ;
2815
2855
2816
2856
/* RAISE with no parameters: re-throw current exception */
@@ -2927,28 +2967,28 @@ exec_stmt_raise(PLpgSQL_execstate *estate, PLpgSQL_stmt_raise *stmt)
2927
2967
condname = pstrdup (extval );
2928
2968
break ;
2929
2969
case PLPGSQL_RAISEOPTION_MESSAGE :
2930
- if (err_message )
2931
- ereport (ERROR ,
2932
- (errcode (ERRCODE_SYNTAX_ERROR ),
2933
- errmsg ("RAISE option already specified: %s" ,
2934
- "MESSAGE" )));
2935
- err_message = pstrdup (extval );
2970
+ SET_RAISE_OPTION_TEXT (err_message , "MESSAGE" );
2936
2971
break ;
2937
2972
case PLPGSQL_RAISEOPTION_DETAIL :
2938
- if (err_detail )
2939
- ereport (ERROR ,
2940
- (errcode (ERRCODE_SYNTAX_ERROR ),
2941
- errmsg ("RAISE option already specified: %s" ,
2942
- "DETAIL" )));
2943
- err_detail = pstrdup (extval );
2973
+ SET_RAISE_OPTION_TEXT (err_detail , "DETAIL" );
2944
2974
break ;
2945
2975
case PLPGSQL_RAISEOPTION_HINT :
2946
- if (err_hint )
2947
- ereport (ERROR ,
2948
- (errcode (ERRCODE_SYNTAX_ERROR ),
2949
- errmsg ("RAISE option already specified: %s" ,
2950
- "HINT" )));
2951
- err_hint = pstrdup (extval );
2976
+ SET_RAISE_OPTION_TEXT (err_hint , "HINT" );
2977
+ break ;
2978
+ case PLPGSQL_RAISEOPTION_COLUMN :
2979
+ SET_RAISE_OPTION_TEXT (err_column , "COLUMN" );
2980
+ break ;
2981
+ case PLPGSQL_RAISEOPTION_CONSTRAINT :
2982
+ SET_RAISE_OPTION_TEXT (err_constraint , "CONSTRAINT" );
2983
+ break ;
2984
+ case PLPGSQL_RAISEOPTION_DATATYPE :
2985
+ SET_RAISE_OPTION_TEXT (err_datatype , "DATATYPE" );
2986
+ break ;
2987
+ case PLPGSQL_RAISEOPTION_TABLE :
2988
+ SET_RAISE_OPTION_TEXT (err_table , "TABLE" );
2989
+ break ;
2990
+ case PLPGSQL_RAISEOPTION_SCHEMA :
2991
+ SET_RAISE_OPTION_TEXT (err_schema , "SCHEMA" );
2952
2992
break ;
2953
2993
default :
2954
2994
elog (ERROR , "unrecognized raise option: %d" , opt -> opt_type );
@@ -2982,7 +3022,17 @@ exec_stmt_raise(PLpgSQL_execstate *estate, PLpgSQL_stmt_raise *stmt)
2982
3022
(err_code ? errcode (err_code ) : 0 ,
2983
3023
errmsg_internal ("%s" , err_message ),
2984
3024
(err_detail != NULL ) ? errdetail_internal ("%s" , err_detail ) : 0 ,
2985
- (err_hint != NULL ) ? errhint ("%s" , err_hint ) : 0 ));
3025
+ (err_hint != NULL ) ? errhint ("%s" , err_hint ) : 0 ,
3026
+ (err_column != NULL ) ?
3027
+ err_generic_string (PG_DIAG_COLUMN_NAME , err_column ) : 0 ,
3028
+ (err_constraint != NULL ) ?
3029
+ err_generic_string (PG_DIAG_CONSTRAINT_NAME , err_constraint ) : 0 ,
3030
+ (err_datatype != NULL ) ?
3031
+ err_generic_string (PG_DIAG_DATATYPE_NAME , err_datatype ) : 0 ,
3032
+ (err_table != NULL ) ?
3033
+ err_generic_string (PG_DIAG_TABLE_NAME , err_table ) : 0 ,
3034
+ (err_schema != NULL ) ?
3035
+ err_generic_string (PG_DIAG_SCHEMA_NAME , err_schema ) : 0 ));
2986
3036
2987
3037
estate -> err_text = NULL ; /* un-suppress... */
2988
3038
@@ -2994,6 +3044,16 @@ exec_stmt_raise(PLpgSQL_execstate *estate, PLpgSQL_stmt_raise *stmt)
2994
3044
pfree (err_detail );
2995
3045
if (err_hint != NULL )
2996
3046
pfree (err_hint );
3047
+ if (err_column != NULL )
3048
+ pfree (err_column );
3049
+ if (err_constraint != NULL )
3050
+ pfree (err_constraint );
3051
+ if (err_datatype != NULL )
3052
+ pfree (err_datatype );
3053
+ if (err_table != NULL )
3054
+ pfree (err_table );
3055
+ if (err_schema != NULL )
3056
+ pfree (err_schema );
2997
3057
2998
3058
return PLPGSQL_RC_OK ;
2999
3059
}
0 commit comments