49 #if defined (SUPPRESS_STRLEN_WARNING) 50 #define strlen(s1) ((int) strlen(s1)) 53 #define TR_EXECUTION_ENABLED (tr_Execution_enabled == true) 54 #define UNIQUE_SAVEPOINT_RENAME_TRIGGER "rENAMEtRIGGER" 55 #define UNIQUE_SAVEPOINT_DROP_TRIGGER "dROPtRIGGER" 56 #define UNIQUE_SAVEPOINT_CREATE_TRIGGER "cREATEtRIGGER" 68 #define IS_USER_EVENT(event) \ 69 ((event) == TR_EVENT_COMMIT || \ 70 (event) == TR_EVENT_ROLLBACK || \ 71 (event) == TR_EVENT_ABORT || \ 72 (event) == TR_EVENT_TIMEOUT) 75 #define IS_CLASS_EVENT(event) (!IS_USER_EVENT(event)) 82 #define COMPARE_TRIGGER_NAMES intl_identifier_casecmp 86 #define MAX_ERROR_STRING 2048 210 const char **tempname);
266 const char *return_str;
275 return_str =
"BEFORE";
279 return_str =
"AFTER";
283 return_str =
"DEFERRED";
287 return_str =
"UNKNOWN";
357 if (activity ==
NULL)
498 for (node = list, next =
NULL; node !=
NULL; node = next)
654 *list = element->
next;
682 for (element = *list; element !=
NULL && element->
trigger != trigger; element = element->
next)
708 for (element = *list; element !=
NULL && element->
trigger != trigger; element = element->
next)
752 if (tr_Deferred_activities ==
NULL)
754 tr_Deferred_activities = def;
755 tr_Deferred_activities_tail = def;
759 tr_Deferred_activities_tail->
next = def;
804 def->
head = triggers;
827 for (c = tr_Deferred_activities, next =
NULL; c !=
NULL; c = next)
834 tr_Deferred_activities = tr_Deferred_activities_tail =
NULL;
848 if (context->
tail == element)
874 tr_Deferred_activities = tr_Deferred_activities_tail =
NULL;
878 tr_Deferred_activities = context->
next;
885 #if defined(ENABLE_UNUSED_FUNCTION) 895 tr_set_savepoint (
void *savepoint_id)
923 tr_abort_to_savepoint (
void *savepoint_id)
927 for (save = tr_Deferred_activities_tail, prev =
NULL; save !=
NULL && save->
savepoint_id != savepoint_id; save = prev)
1016 if (class_p ==
NULL)
1134 if (object_p !=
NULL)
1136 trigger->
object = object_p;
1182 trigger->
object = object;
1467 switch (trigger->
event)
1470 switch (activity->
time)
1485 switch (activity->
time)
1504 switch (activity->
time)
1523 switch (trigger->
event)
1526 switch (activity->
time)
1541 switch (activity->
time)
1560 switch (activity->
time)
1597 const char *curname, *tempname;
1623 text = (
char *) malloc (length);
1630 strcat (text, activity->
source);
1650 if (curname ==
NULL)
1784 *trigger = new_trigger;
1834 if (trigger !=
NULL)
1844 if (trigger !=
NULL)
1853 if (
mht_put (tr_object_map,
object, trigger) ==
NULL)
2031 if (error ==
NO_ERROR && !rollback)
2058 *trigger_list =
NULL;
2085 for (i = 0; i < max && error ==
NO_ERROR; i++)
2094 if (trigger ==
NULL)
2131 *trigger_list =
NULL;
2155 if (tr_User_triggers !=
NULL)
2158 tr_User_triggers =
NULL;
2177 for (i = 0; i < max && error ==
NO_ERROR; i++)
2187 if (trigger ==
NULL)
2208 else if (tr_User_triggers !=
NULL)
2211 tr_User_triggers =
NULL;
2217 #if defined(ENABLE_UNUSED_FUNCTION) 2261 int elements, size,
i;
2283 for (i = 0; i < elements; i++)
2290 tr_Schema_caches = cache;
2325 if (new_ent ==
NULL)
2332 if (filter_class ==
NULL)
2342 for (obj_list = cache->
objects; obj_list !=
NULL; obj_list = obj_list->
next)
2345 if (trigger ==
NULL)
2364 if (new_ent !=
NULL)
2387 if (destination !=
NULL && source !=
NULL)
2389 for (obj_list = source->
objects; obj_list !=
NULL && !error; obj_list = obj_list->
next)
2443 for (c = tr_Schema_caches, prev =
NULL; c !=
NULL && c != cache; c = c->
next)
2456 tr_Schema_caches = c->
next;
2493 if (trigger ==
NULL)
2533 if (trigger ==
NULL)
2618 for (object_list = cache->
objects, prev =
NULL, next =
NULL; object_list !=
NULL && cache !=
NULL; object_list = next)
2620 next = object_list->
next;
2633 if (mop_found ==
false)
2706 #if defined(ENABLE_UNUSED_FUNCTION) 2761 for (c = tr_Schema_caches; c !=
NULL; c = c->
next)
2788 bool * has_event_type_triggers)
2792 bool result =
false;
2818 if (has_event_type_triggers)
2820 *has_event_type_triggers = result;
2862 if (trigger !=
NULL)
2874 if (trigger->
status != TR_STATUS_INVALID)
2922 if ((
NULL == cache) || (*cache ==
NULL))
2940 for (m = (*cache)->objects; m !=
NULL; m = m->
next)
2943 if (trigger ==
NULL)
3158 for (i = 0, found = -1; i < max && error ==
NO_ERROR && found == -1; i += 2)
3213 int max, save,
i, found;
3268 for (i = 1, found = -1; i < max && error ==
NO_ERROR && found == -1; i += 2)
3313 int max,
i, found, save;
3352 for (i = 0, found = -1; i < max && error ==
NO_ERROR && found == -1; i += 2)
3410 bool status =
false;
3508 for (i = 1; i < max && error ==
NO_ERROR; i += 2)
3517 if (trigger ==
NULL)
3564 *object_list =
NULL;
3606 else if (event < cache->array_length)
3620 *object_list =
NULL;
3656 if (class_mop ==
NULL)
3681 bool status =
false;
3687 if (class_mop ==
NULL)
3694 if (attribute ==
NULL)
3716 if (class_mop !=
NULL)
3720 else if (attribute !=
NULL)
3745 const char *c_time, *a_time;
3804 action = trigger->
action;
3919 const char *comment)
3924 bool tr_object_map_added =
false;
3925 bool has_savepoint =
false;
3930 if (trigger ==
NULL)
3937 trigger->
status = status;
3939 trigger->
event = event;
3943 if (class_mop !=
NULL)
3964 if (attribute !=
NULL)
3980 if (cond_source !=
NULL)
4025 if (action_source !=
NULL)
4073 has_savepoint =
true;
4105 if (
mht_put (tr_object_map,
object, trigger) ==
NULL)
4110 tr_object_map_added =
true;
4142 if (trigger !=
NULL)
4146 if (tr_object_map_added)
4234 if (trigger ==
NULL)
4312 if (trigger ==
NULL)
4352 bool has_savepoint =
false;
4363 has_savepoint =
true;
4396 if (error ==
NO_ERROR && !rollback)
4446 char *trigger_name =
NULL;
4460 if (trigger ==
NULL)
4469 if (trigger ==
NULL)
4531 status = (
db_get_int (value) == 0) ?
false :
true;
4543 status = (*
db_get_time (value) == 0) ?
false :
true;
4553 status = (ts_tz->
timestamp == 0) ?
false :
true;
4568 status = (*
db_get_date (value) == 0) ?
false :
true;
4609 strcpy (buffer,
"");
4613 strncpy (buffer, msg,
sizeof (buffer) - 1);
4648 fprintf (stdout,
"TRACE: Evaluating condition for trigger \"%s\".\n", trigger->
name);
4686 if (current ==
NULL)
4752 for (i = 0; i <
min; i++)
4784 bool is_statement =
false;
4785 bool used_cached_statement =
true;
4839 fprintf (stdout,
"TRACE: Executing action for trigger \"%s\".\n", trigger->
name);
4876 used_cached_statement =
false;
4892 if (current ==
NULL)
4912 goto compile_stmt_again;
4979 bool execute_action;
4996 execute_action =
true;
5006 execute_action =
false;
5026 execute_action =
true;
5030 if (execute_action && trigger->
action !=
NULL)
5052 if (save_user !=
NULL)
5150 for (t = tr_User_triggers; t !=
NULL && !
error; t = t->
next)
5208 ret = (rl_1 > rl_2) ? 1 : -1;
5268 const char **attnames)
5308 if (event < cache->array_length)
5318 for (i = 0; i < attcount; i++)
5341 if (event < cache->array_length)
5357 if (triggers !=
NULL)
5388 if (triggers !=
NULL)
5399 #if defined(ENABLE_UNUSED_FUNCTION) 5482 else if (event < cache->array_length)
5666 bool has_user_trigger_local;
5671 *has_user_trigger =
false;
5675 if (tr_Deferred_activities)
5677 *has_user_trigger =
true;
5690 has_user_trigger_local =
false;
5691 for (t = tr_User_triggers; t !=
NULL; t = t->
next)
5695 has_user_trigger_local =
true;
5700 *has_user_trigger = has_user_trigger_local;
5755 else if (tr_Uncommitted_triggers !=
NULL)
5759 tr_Uncommitted_triggers =
NULL;
5808 if (tr_Uncommitted_triggers !=
NULL)
5810 for (t = tr_Uncommitted_triggers, next =
NULL; t !=
NULL; t = next)
5820 tr_Uncommitted_triggers =
NULL;
5836 #if defined(ENABLE_UNUSED_FUNCTION) 5845 tr_check_timeout_triggers (
void)
5976 for (c = tr_Deferred_activities, c_next =
NULL; c !=
NULL && !
error; c = c_next)
5980 for (t = c->
head, next =
NULL; t !=
NULL && !error; t = next)
5985 if ((trigger_object ==
NULL || trigger->
object == trigger_object) && (target ==
NULL || t->
target == target))
6063 for (c = tr_Deferred_activities, c_next =
NULL; c !=
NULL && !
error; c = c_next)
6067 for (t = c->
head, next =
NULL; t !=
NULL && !error; t = next)
6119 if (trigger ==
NULL)
6154 if (trigger ==
NULL)
6160 *status = trigger->
status;
6189 if (trigger ==
NULL)
6224 if (trigger ==
NULL)
6230 *
event = trigger->
event;
6256 *class_mop_p =
NULL;
6260 if (trigger ==
NULL)
6296 if (trigger ==
NULL)
6332 if (trigger ==
NULL)
6368 if (trigger ==
NULL)
6404 if (trigger ==
NULL)
6430 snprintf (buf,
sizeof (buf) - 1,
"PRINT '%s'", trigger->
action->
source);
6466 if (trigger ==
NULL)
6500 if (trigger ==
NULL)
6535 if (trigger ==
NULL)
6565 if (tclass == oclass)
6595 string =
"DEFERRED";
6621 string =
"STATEMENT UPDATE";
6627 string =
"STATEMENT DELETE";
6633 string =
"STATEMENT INSERT";
6645 string =
"ROLLBACK";
6681 string =
"INACTIVE";
6691 #if defined(ENABLE_UNUSED_FUNCTION) 6708 tr_dump_all_triggers (FILE * fp,
bool quoted_id_flag)
6731 for (i = 1; i < max && error ==
NO_ERROR; i += 2)
6740 if (trigger ==
NULL)
6754 fprintf (fp,
"call [change_trigger_owner]('%s'," " '%s') on class [db_root];\n\n",
6785 char *newname, *oldname;
6786 char *tr_name =
NULL;
6788 bool has_savepoint =
false;
6794 if (trigger ==
NULL)
6803 if (trigger ==
NULL)
6815 if (newname ==
NULL)
6827 has_savepoint =
true;
6839 oldname = trigger->
name;
6840 trigger->
name = newname;
6856 newname = trigger->
name;
6857 trigger->
name = oldname;
6862 if (oldname !=
NULL)
6868 if (newname !=
NULL)
6913 if (trigger ==
NULL)
6924 oldstatus = trigger->
status;
6925 trigger->
status = status;
6935 trigger->
status = oldstatus;
6980 if (trigger ==
NULL)
7044 char *oldcomment =
NULL;
7050 if (trigger ==
NULL)
7062 oldcomment = (
char *) trigger->
comment;
7067 trigger->
comment = oldcomment;
7077 trigger->
comment = oldcomment;
7081 if (oldcomment !=
NULL)
7168 tr_Deferred_activities =
NULL;
7169 tr_Deferred_activities_tail =
NULL;
7172 tr_User_triggers =
NULL;
7174 tr_Uncommitted_triggers =
NULL;
7176 tr_Schema_caches =
NULL;
7211 tr_User_triggers =
NULL;
7212 tr_Uncommitted_triggers =
NULL;
7215 if (tr_object_map !=
NULL)
7219 tr_object_map =
NULL;
7226 tr_Schema_caches =
NULL;
7245 fprintf (fpp,
"TRIGGER MANAGER STATISTICS\n");
7247 fprintf (fpp,
"Trigger execution state : %s\n",
TR_EXECUTION_ENABLED ?
"ENABLED" :
"DISABLED");
7248 if (tr_Deferred_activities ==
NULL)
7250 fprintf (fpp,
"No deferred triggers.\n");
7254 fprintf (fpp,
"Deferred trigger list:\n");
7255 for (c = tr_Deferred_activities; c !=
NULL; c = c->
next)
7375 if (class_mop ==
NULL)
7445 #if defined(ENABLE_UNUSED_FUNCTION) 7452 tr_downcase_all_trigger_info (
void)
7460 if (class_mop ==
NULL)
7471 for (mop = list; mop !=
NULL; mop = mop->
next)
DB_OBJECT * db_find_class(const char *name)
DB_C_FLOAT db_get_float(const DB_VALUE *value)
#define ER_LK_UNILATERALLY_ABORTED
static int eval_action(TR_TRIGGER *trigger, DB_OBJECT *current, DB_OBJECT *temp, bool *reject)
int tr_set_depth(int depth)
void ws_clear_hints(MOP mop, bool leave_pinned)
int tran_system_savepoint(const char *savept_name)
int tr_delete_triggers_for_class(TR_SCHEMA_CACHE **cache, DB_OBJECT *class_object)
#define WS_IS_DELETED(mop)
int tr_drop_cache_trigger(TR_SCHEMA_CACHE *cache, DB_OBJECT *trigger_object)
PT_NODE * pt_get_errors(PARSER_CONTEXT *parser)
unsigned int mht_ptrhash(const void *key, const unsigned int ht_size)
TR_DEFERRED_CONTEXT * tr_Deferred_activities_tail
const char * TR_ATT_CONDITION_TIME
int tr_delete_schema_cache(TR_SCHEMA_CACHE *cache, DB_OBJECT *class_object)
int set_drop_seq_element(DB_COLLECTION *set, int index)
DB_COLLECTION * db_get_set(const DB_VALUE *value)
int tr_find_event_triggers(DB_TRIGGER_EVENT event, DB_OBJECT *class_mop, const char *attribute, bool active, DB_OBJLIST **list)
int tr_is_trigger(DB_OBJECT *trigger_object, int *status)
static int check_semantics(TR_TRIGGER *trigger)
int sm_is_system_class(MOP op)
#define ER_TR_INVALID_PRIORITY
static int tr_execute_activities(TR_STATE *state, DB_TRIGGER_TIME tr_time, DB_OBJECT *current, DB_OBJECT *temp)
#define ER_TR_BAD_TARGET_ATTR
int tr_merge_schema_cache(TR_SCHEMA_CACHE *destination, TR_SCHEMA_CACHE *source)
static PT_NODE * tr_check_correlation(PARSER_CONTEXT *parser, PT_NODE *node, void *arg, int *walk_on)
const char * db_get_class_name(DB_OBJECT *class_)
static int tr_User_triggers_valid
static void free_state(TR_STATE *state)
#define ER_TR_NO_VCLASSES
#define ER_MVCC_SERIALIZABLE_CONFLICT
#define ER_TR_REJECT_NOT_POSSIBLE
int tr_trigger_condition(DB_OBJECT *trigger_object, char **condition)
bool tr_get_execution_state(void)
#define ER_TR_TRIGGER_SELECT_FAILURE
static TR_ACTIVITY * make_activity(void)
int tr_add_cache_trigger(TR_SCHEMA_CACHE *cache, DB_OBJECT *trigger_object)
void set_free(DB_COLLECTION *set)
static int run_user_triggers(DB_TRIGGER_EVENT event, DB_TRIGGER_TIME time)
struct tr_activity * condition
static int validate_trigger(TR_TRIGGER *trigger)
#define PT_ERROR(parser, node, msg)
int db_get_int(const DB_VALUE *value)
MOBJ locator_create_heap_if_needed(MOP class_mop, bool reuse_oid)
int db_is_vclass(DB_OBJECT *op)
DB_C_DOUBLE db_get_double(const DB_VALUE *value)
const char * TR_ATT_ACTION
#define UNIQUE_SAVEPOINT_DROP_TRIGGER
int pt_exec_trigger_stmt(PARSER_CONTEXT *parser, PT_NODE *trigger_stmt, DB_OBJECT *object1, DB_OBJECT *object2, DB_VALUE *result)
int tr_trigger_action_type(DB_OBJECT *trigger_object, DB_TRIGGER_ACTION *type)
int tr_trigger_attribute(DB_OBJECT *trigger_object, char **attribute)
#define ER_TR_INVALID_CONDITION_TYPE
int mht_rem(MHT_TABLE *ht, const void *key, int(*rem_func)(const void *key, void *data, void *args), void *func_args)
#define TR_MAX_RECURSION_LEVEL
char tr_Invalid_transaction_trigger[SM_MAX_IDENTIFIER_LENGTH+2]
#define ER_QPROC_INVALID_XASLNODE
int tr_has_user_trigger(bool *has_user_trigger)
void pt_reset_error(PARSER_CONTEXT *parser)
void tr_abort(TR_STATE *state)
int sm_invalidate_trigger_cache(DB_OBJECT *classop)
const char * tr_time_as_string(DB_TRIGGER_TIME time)
const void * mht_put(MHT_TABLE *ht, const void *key, void *data)
static int map_flush_helper(const void *key, void *data, void *args)
#define ASSERT_ERROR_AND_SET(error_code)
static TR_TRIGLIST * tr_User_triggers
const char * TR_ATT_ACTION_TYPE
int tr_empty_schema_cache(TR_SCHEMA_CACHE *cache)
DB_OBJLIST * ml_ext_copy(DB_OBJLIST *list)
int db_make_object(DB_VALUE *value, DB_C_OBJECT *obj)
#define SM_MAX_IDENTIFIER_LENGTH
DB_COLLECTION * set_create_sequence(int size)
PT_NODE * pt_get_next_error(PT_NODE *errors, int *stmt_no, int *line_no, int *col_no, const char **msg)
PARSER_CONTEXT * parser_create_parser(void)
static int compare_recursion_levels(int rl_1, int rl_2)
int tr_rename_trigger(DB_OBJECT *trigger_object, const char *name, bool call_from_api)
static void tr_finish(TR_STATE *state)
bool au_is_dba_group_member(MOP user)
DB_OBJECT * dbt_finish_class(DB_CTMPL *def)
#define IS_CLASS_EVENT(event)
const char * TR_ATT_CONDITION_TYPE
int tr_trigger_name(DB_OBJECT *trigger_object, char **name)
int tr_trigger_priority(DB_OBJECT *trigger_object, double *priority)
TR_DEFERRED_CONTEXT * tr_Deferred_activities
DB_DATETIMETZ * db_get_datetimetz(const DB_VALUE *value)
void sm_downcase_name(const char *name, char *buf, int maxlen)
static void tr_clear_trigger(TR_TRIGGER *trigger)
#define ER_TR_ACTION_EVAL
static const int TR_RETURN_FALSE
int db_make_sequence(DB_VALUE *value, DB_C_SET *set)
#define ER_TR_CONDITION_EVAL
#define TR_LOWEST_PRIORITY
#define ER_TR_TRIGGER_NOT_FOUND
DB_OBJECT * dbt_finish_object(DB_OTMPL *def)
TR_TRIGLIST * triggers[1]
static void flush_deferred_activities(void)
static int tr_drop_trigger_internal(TR_TRIGGER *trigger, int rollback, bool need_savepoint)
int tr_prepare_statement(TR_STATE **state_p, DB_TRIGGER_EVENT event, DB_OBJECT *class_mop, int attcount, const char **attnames)
#define ER_TR_MAX_DEPTH_TOO_BIG
static int compile_trigger_activity(TR_TRIGGER *trigger, TR_ACTIVITY *activity, int with_evaluate)
#define ER_TR_TRIGGER_ALTER_FAILURE
void dbt_abort_object(DB_OTMPL *def)
static TR_TRIGLIST * tr_Uncommitted_triggers
int set_size(DB_COLLECTION *set)
int tr_trigger_action(DB_OBJECT *trigger_object, char **action)
static int its_deleted(DB_OBJECT *object)
int tr_drop_trigger(DB_OBJECT *obj, bool call_from_api)
void db_ws_free(void *ptr)
int tr_before(TR_STATE *state)
bool ws_is_same_object(MOP mop1, MOP mop2)
struct tr_triglist * prev
const char * TR_ATT_CONDITION
struct tr_schema_cache * next
int tr_trigger_comment(DB_OBJECT *trigger_object, char **comment)
static int trigger_table_rename(DB_OBJECT *trigger_object, const char *newname)
#define ER_TR_CONDITION_COMPILE
static void remove_deferred_activity(TR_DEFERRED_CONTEXT *context, TR_TRIGLIST *element)
void parser_free_parser(PARSER_CONTEXT *parser)
static TR_STATE * start_state(TR_STATE **current, const char *name)
int sm_drop_trigger(DB_OBJECT *classop, const char *attribute, int class_attribute, DB_OBJECT *trigger)
static int trigger_table_drop(const char *name)
DB_TIMESTAMPTZ * db_get_timestamptz(const DB_VALUE *value)
int dbt_put_internal(DB_OTMPL *def, const char *name, DB_VALUE *value)
#define ER_TR_TRANSACTION_INVALIDATED
static void free_activity(TR_ACTIVITY *act)
int tr_set_status(DB_OBJECT *trigger_object, DB_TRIGGER_STATUS status, bool call_from_api)
const char * TR_ATT_CLASS_ATTRIBUTE
static const char * NEW_REFERENCE_NAME
#define ER_TR_MISSING_TARGET_CLASS
int db_make_string(DB_VALUE *value, DB_CONST_C_CHAR str)
DB_MONETARY * db_get_monetary(const DB_VALUE *value)
DB_OBJECT * tr_find_trigger(const char *name)
static bool tr_Execution_enabled
void mht_destroy(MHT_TABLE *ht)
int sm_find_subclass_in_hierarchy(MOP hierarchy, MOP class_mop, bool *found)
DB_ATTRIBUTE * db_get_attribute(DB_OBJECT *obj, const char *name)
void er_set(int severity, const char *file_name, const int line_no, int err_id, int num_args,...)
#define TR_MAX_PRINT_STRING
struct tr_activity * action
static void remove_trigger_list(TR_TRIGLIST **list, TR_TRIGGER *trigger)
static bool check_authorization(TR_TRIGGER *trigger, bool alter_flag)
static TR_TRIGGER * tr_make_trigger(void)
const char * TR_ATT_ACTION_OLD
static int eval_condition(TR_TRIGGER *trigger, DB_OBJECT *current, DB_OBJECT *temp, bool *status)
const char * tr_get_class_name(void)
int tran_abort_upto_system_savepoint(const char *savepoint_name)
const char * TR_ATT_EVENT
int set_filter(DB_COLLECTION *set)
int tr_find_all_triggers(DB_OBJLIST **list)
static const char * EVAL_PREFIX
struct tr_schema_cache TR_SCHEMA_CACHE
int prm_get_integer_value(PARAM_ID prm_id)
#define ER_TR_BAD_TARGET_CLASS
int tr_trigger_condition_time(DB_OBJECT *trigger_object, DB_TRIGGER_TIME *tr_time)
#define ER_OUT_OF_VIRTUAL_MEMORY
static TR_STATE * make_state(void)
int tr_validate_schema_cache(TR_SCHEMA_CACHE *cache, MOP class_mop)
static int tr_User_triggers_modified
int tr_trigger_action_time(DB_OBJECT *trigger_object, DB_TRIGGER_TIME *tr_time)
static const int TR_RETURN_TRUE
static void get_reference_names(TR_TRIGGER *trigger, TR_ACTIVITY *activity, const char **curname, const char **tempname)
static void reinsert_trigger_list(TR_TRIGLIST **list, TR_TRIGGER *trigger)
static int unregister_user_trigger(TR_TRIGGER *trigger, int rollback)
static const char * EVAL_SUFFIX
OID tr_Stack[TR_MAX_RECURSION_LEVEL+1]
bool tr_Invalid_transaction
const char * sm_get_ch_name(MOP op)
DB_OBJECT * db_get_object(const DB_VALUE *value)
int au_check_authorization(MOP op, DB_AUTH auth)
#define ER_EMERGENCY_ERROR
void * mht_get(MHT_TABLE *ht, const void *key)
#define ER_TR_INVALID_ACTION_TIME
#define UNIQUE_SAVEPOINT_RENAME_TRIGGER
const char * er_msg(void)
const char * TR_ATT_COMMENT
int db_drop(DB_OBJECT *obj)
static TR_RECURSION_DECISION tr_check_recursivity(OID oid, OID stack[], int stack_size, bool is_statement)
int sm_check_name(const char *name)
const char * TR_ATT_PROPERTIES
int dbt_add_attribute(DB_CTMPL *def, const char *name, const char *domain, DB_VALUE *default_value)
int sm_add_trigger(DB_OBJECT *classop, const char *attribute, int class_attribute, DB_OBJECT *trigger)
int au_fetch_instance_force(MOP op, MOBJ *obj_ptr, AU_FETCHMODE fetchmode, LC_FETCH_VERSION_TYPE fetch_version_type)
int ml_remove(DB_OBJLIST **list, MOP mop)
#define ER_TR_TRIGGER_DELETE_FAILURE
DB_CTMPL * dbt_create_class(const char *name)
#define TM_TRAN_READ_FETCH_VERSION()
MHT_TABLE * mht_create(const char *name, int est_size, unsigned int(*hash_func)(const void *key, unsigned int ht_size), int(*cmp_func)(const void *key1, const void *key2))
#define ER_TR_INTERNAL_ERROR
int tr_set_trace(bool trace)
#define COMPARE_TRIGGER_NAMES
static DB_OBJECT * trigger_to_object(TR_TRIGGER *trigger)
int ml_ext_add(DB_OBJLIST **list, MOP mop, int *added_ptr)
int tr_prepare_class(TR_STATE **state_p, TR_SCHEMA_CACHE *cache, MOP class_mop, DB_TRIGGER_EVENT event)
#define ER_TR_ACTION_COMPILE
int db_put_internal(DB_OBJECT *obj, const char *name, DB_VALUE *value)
int set_get_element(DB_COLLECTION *set, int index, DB_VALUE *value)
void ml_free(DB_OBJLIST *list)
static int find_event_triggers(DB_TRIGGER_EVENT event, DB_OBJECT *class_mop, const char *attribute, bool active_filter, DB_OBJLIST **list)
int tr_after(TR_STATE *state)
int pr_clear_value(DB_VALUE *value)
DB_BIGINT db_get_bigint(const DB_VALUE *value)
static const char * time_as_string(DB_TRIGGER_TIME tr_time)
static int execute_activity(TR_TRIGGER *trigger, DB_TRIGGER_TIME tr_time, DB_OBJECT *current, DB_OBJECT *temp, bool *rejected)
int tr_set_comment(DB_OBJECT *trigger_object, const char *comment, bool call_from_api)
int tr_unmap_trigger(TR_TRIGGER *trigger)
int ws_mop_compare(MOP mop1, MOP mop2)
unsigned short array_length
int locator_flush_instance(MOP mop)
int tr_set_priority(DB_OBJECT *trigger_object, double priority, bool call_from_api)
int mht_compare_ptrs_are_equal(const void *key1, const void *key2)
const char * TR_CLASS_NAME
int set_put_element(DB_COLLECTION *set, int index, DB_VALUE *value)
static void error(const char *msg)
PT_NODE * pt_compile_trigger_stmt(PARSER_CONTEXT *parser, const char *trigger_stmt, DB_OBJECT *class_op, const char *name1, const char *name2)
int db_make_float(DB_VALUE *value, const DB_C_FLOAT num)
int ml_add(DB_OBJLIST **list, MOP mop, int *added_ptr)
int tr_update_user_cache(void)
DB_OBJLIST * sm_fetch_all_objects(DB_OBJECT *op, DB_FETCH_MODE purpose)
const char * TR_ATT_PRIORITY
void tr_free_trigger_list(TR_TRIGLIST *list)
DB_OTMPL * dbt_create_object_internal(DB_OBJECT *classobj)
static int get_user_trigger_objects(DB_TRIGGER_EVENT event, bool active_filter, DB_OBJLIST **trigger_list)
DB_OBJLIST * ml_copy(DB_OBJLIST *list)
static TR_SCHEMA_CACHE * tr_Schema_caches
void parser_free_tree(PARSER_CONTEXT *parser, PT_NODE *tree)
int tr_get_cache_objects(TR_SCHEMA_CACHE *cache, DB_OBJLIST **list)
const char * tr_event_as_string(DB_TRIGGER_EVENT event)
int locator_all_flush(void)
int obj_set(MOP op, const char *name, DB_VALUE *value)
static int get_schema_trigger_objects(DB_OBJECT *class_mop, const char *attribute, DB_TRIGGER_EVENT event, bool active_flag, DB_OBJLIST **objlist)
#define ER_TR_EXCEEDS_MAX_REC_LEVEL
static void free_trigger(TR_TRIGGER *trigger)
static TR_DEFERRED_CONTEXT * add_deferred_activity_context(void)
void tr_check_abort_triggers(void)
int tr_dump_trigger(print_output &output_ctx, DB_OBJECT *trigger_object)
static char * tr_process_name(const char *name_string)
#define ER_TR_REJECT_AFTER_EVENT
#define free_and_init(ptr)
static void reorder_schema_caches(TR_TRIGGER *trigger)
static int trigger_table_add(const char *name, DB_OBJECT *trigger)
DB_DATE * db_get_date(const DB_VALUE *value)
int oid_compare(const void *a, const void *b)
static const int TR_RETURN_ERROR
static char * get_user_name(DB_OBJECT *user)
int obj_inst_lock(MOP op, int for_write)
int db_make_string_copy(DB_VALUE *value, DB_CONST_C_CHAR str)
const char * TR_ATT_CLASS
#define ER_HEAP_UNKNOWN_OBJECT
int tr_trigger_event(DB_OBJECT *trigger_object, DB_TRIGGER_EVENT *event)
int db_get(DB_OBJECT *object, const char *attpath, DB_VALUE *value)
bool tr_set_execution_state(bool new_state)
void ml_ext_free(DB_OBJLIST *list)
static void remove_deferred_context(TR_DEFERRED_CONTEXT *c)
struct tr_deferred_context * prev
bool prm_get_bool_value(PARAM_ID prm_id)
const char * tr_status_as_string(DB_TRIGGER_STATUS status)
static int merge_trigger_list(TR_TRIGLIST **list, TR_TRIGLIST *more, int destructive)
DB_TIMESTAMP * db_get_timestamp(const DB_VALUE *value)
DB_C_SHORT db_get_short(const DB_VALUE *value)
struct tr_triglist * next
void * db_ws_alloc(size_t size)
int tr_active_schema_cache(MOP class_mop, TR_SCHEMA_CACHE *cache, DB_TRIGGER_EVENT event_type, bool *has_event_type_triggers)
int tr_trigger_status(DB_OBJECT *trigger_object, DB_TRIGGER_STATUS *status)
TR_SCHEMA_CACHE * tr_make_schema_cache(TR_CACHE_TYPE type, DB_OBJLIST *objects)
int tr_before_object(TR_STATE *state, DB_OBJECT *current, DB_OBJECT *temp)
struct tr_deferred_context * next
TR_TRIGGER * tr_map_trigger(DB_OBJECT *object, int fetch)
#define DB_VALUE_TYPE(value)
TR_SCHEMA_CACHE * tr_copy_schema_cache(TR_SCHEMA_CACHE *cache, MOP filter_class)
static int register_user_trigger(DB_OBJECT *object)
int mht_map(const MHT_TABLE *ht, int(*map_func)(const void *key, void *data, void *args), void *func_args)
#define UNIQUE_SAVEPOINT_CREATE_TRIGGER
static const char * OLD_REFERENCE_NAME
#define DB_IS_NULL(value)
static int object_to_trigger(DB_OBJECT *object, TR_TRIGGER *trigger)
MOP sm_get_class(MOP obj)
static int signal_evaluation_error(TR_TRIGGER *trigger, int error)
static bool check_target(DB_TRIGGER_EVENT event, DB_OBJECT *class_mop, const char *attribute)
static const char * OBJ_REFERENCE_NAME
int obj_get(MOP op, const char *name, DB_VALUE *value)
int db_make_double(DB_VALUE *value, const DB_C_DOUBLE num)
char * strdup(const char *str)
void dbt_abort_class(DB_CTMPL *def)
DB_DATETIME * db_get_datetime(const DB_VALUE *value)
const char * TR_ATT_OWNER
int db_value_clear(DB_VALUE *value)
int set_insert_element(DB_COLLECTION *set, int index, DB_VALUE *value)
int db_make_int(DB_VALUE *value, const int num)
const char * TR_ATT_ACTION_TIME
#define pt_has_error(parser)
MOP sm_find_class(const char *name)
static int trigger_table_find(const char *name, DB_OBJECT **trigger_p)
static int add_deferred_activities(TR_TRIGLIST *triggers, MOP current)
DB_OBJECT * tr_create_trigger(const char *name, DB_TRIGGER_STATUS status, double priority, DB_TRIGGER_EVENT event, DB_OBJECT *class_mop, const char *attribute, DB_TRIGGER_TIME cond_time, const char *cond_source, DB_TRIGGER_TIME action_time, DB_TRIGGER_ACTION action_type, const char *action_source, const char *comment)
int tr_trigger_class(DB_OBJECT *trigger_object, DB_OBJECT **class_mop_p)
int tr_check_commit_triggers(DB_TRIGGER_TIME time)
#define ER_TR_TRIGGER_EXISTS
#define ER_TR_MISSING_ACTION_STRING
void tr_free_schema_cache(TR_SCHEMA_CACHE *cache)
char * ws_copy_string(const char *str)
DB_TIME * db_get_time(const DB_VALUE *value)
#define TR_EXECUTION_ENABLED
int tr_after_object(TR_STATE *state, DB_OBJECT *current, DB_OBJECT *temp)
int tr_check_authorization(DB_OBJECT *trigger_object, int alter_flag)
static int find_all_triggers(bool active_filter, bool alter_filter, DB_OBJLIST **list)
#define ER_TR_INVALID_EVENT
static MHT_TABLE * tr_object_map
void tr_invalidate_user_cache(void)
#define ER_TR_CORRELATION_ERROR
int sm_get_trigger_cache(DB_OBJECT *classop, const char *attribute, int class_attribute, void **cache)
int tr_drop_deferred_activities(DB_OBJECT *trigger_object, DB_OBJECT *target)
static int insert_trigger_list(TR_TRIGLIST **list, TR_TRIGGER *trigger)
PT_NODE * parser_walk_tree(PARSER_CONTEXT *parser, PT_NODE *node, PT_NODE_WALK_FUNCTION pre_function, void *pre_argument, PT_NODE_WALK_FUNCTION post_function, void *post_argument)
const char * TR_ATT_STATUS
const char * TR_ATT_ATTRIBUTE
static bool value_as_boolean(DB_VALUE *value)
#define ER_TR_ACTIVITY_NOT_OWNED
static void remove_trigger_list_element(TR_TRIGLIST **list, TR_TRIGLIST *element)
int au_fetch_class_force(MOP op, SM_CLASS **class_, AU_FETCHMODE fetchmode)
static const int TR_EST_MAP_SIZE
DB_CONST_C_CHAR db_get_string(const DB_VALUE *value)
#define ER_IS_ABORTED_DUE_TO_DEADLOCK(err)
int set_drop_element(DB_COLLECTION *set, DB_VALUE *value, bool match_nulls)
int tr_execute_deferred_activities(DB_OBJECT *trigger_object, DB_OBJECT *target)
#define TM_TRAN_ISOLATION()
void tr_check_rollback_triggers(DB_TRIGGER_TIME time)
static int define_trigger_classes(void)