in sources/cg_json_schema.c [1209:1303]
static void cg_json_triggers(charbuf *output) {
bprintf(output, "\"triggers\" : [\n");
BEGIN_INDENT(indices, 2);
BEGIN_LIST;
for (list_item *item = all_triggers_list; item; item = item->next) {
ast_node *ast = item->ast;
Invariant(is_ast_create_trigger_stmt(ast));
EXTRACT_OPTION(flags, ast->left);
EXTRACT_NOTNULL(trigger_body_vers, ast->right);
EXTRACT_NOTNULL(trigger_def, trigger_body_vers->left);
EXTRACT_STRING(trigger_name, trigger_def->left);
EXTRACT_NOTNULL(trigger_condition, trigger_def->right);
EXTRACT_OPTION(cond_flags, trigger_condition->left);
flags |= cond_flags;
EXTRACT_NOTNULL(trigger_op_target, trigger_condition->right);
EXTRACT_NOTNULL(trigger_operation, trigger_op_target->left);
EXTRACT_OPTION(op_flags, trigger_operation->left);
EXTRACT(name_list, trigger_operation->right);
flags |= op_flags;
EXTRACT_NOTNULL(trigger_target_action, trigger_op_target->right);
EXTRACT_ANY_NOTNULL(table_name_ast, trigger_target_action->left);
EXTRACT_NOTNULL(trigger_action, trigger_target_action->right);
EXTRACT_OPTION(action_flags, trigger_action->left);
flags |= action_flags;
EXTRACT_NOTNULL(trigger_when_stmts, trigger_action->right);
EXTRACT_ANY(when_expr, trigger_when_stmts->left);
EXTRACT_NOTNULL(stmt_list, trigger_when_stmts->right);
ast_node *misc_attrs = NULL;
ast_node *attr_target = ast->parent;
if (is_ast_stmt_and_attr(attr_target)) {
EXTRACT_STMT_AND_MISC_ATTRS(stmt, misc, attr_target->parent);
misc_attrs = misc;
}
cg_json_test_details(output, ast, misc_attrs);
// use the canonical name (which may be case-sensitively different)
CSTR table_name = table_name_ast->sem->sptr->struct_name;
COMMA;
bprintf(output, "{\n");
BEGIN_INDENT(trigger, 2);
bool_t is_deleted = ast->sem->delete_version > 0;
bprintf(output, "\"name\" : \"%s\"", trigger_name);
bprintf(output, ",\n\"CRC\" : \"%lld\"", crc_stmt(ast));
bprintf(output, ",\n\"target\" : \"%s\"", table_name);
bprintf(output, ",\n\"isTemp\" : %d", !!(flags & TRIGGER_IS_TEMP));
bprintf(output, ",\n\"ifNotExists\" : %d", !!(flags & TRIGGER_IF_NOT_EXISTS));
bprintf(output, ",\n\"isDeleted\" : %d", is_deleted);
if (is_deleted) {
bprintf(output, ",\n\"deletedVersion\" : %d", ast->sem->delete_version);
}
// only one of these
cg_json_opt_bool(output, (flags & TRIGGER_BEFORE), "isBeforeTrigger");
cg_json_opt_bool(output, (flags & TRIGGER_AFTER), "isAfterTrigger");
cg_json_opt_bool(output, (flags & TRIGGER_INSTEAD_OF), "isInsteadOfTrigger");
// only one of these
cg_json_opt_bool(output, (flags & TRIGGER_DELETE), "isDeleteTrigger");
cg_json_opt_bool(output, (flags & TRIGGER_INSERT), "isInsertTrigger");
cg_json_opt_bool(output, (flags & TRIGGER_UPDATE), "isUpdateTrigger");
cg_json_opt_bool(output, (flags & TRIGGER_FOR_EACH_ROW), "forEachRow");
if (when_expr) {
cg_fragment_with_params(output, "whenExpr", when_expr, gen_root_expr);
}
cg_fragment_with_params(output, "statement", ast, gen_one_stmt);
if (ast->sem->region) {
cg_json_emit_region_info(output, ast);
}
if (misc_attrs) {
bprintf(output, ",\n");
cg_json_misc_attrs(output, misc_attrs);
}
cg_json_dependencies(output, ast);
END_INDENT(trigger);
bprintf(output, "\n}");
}
END_INDENT(indices);
END_LIST;
bprintf(output, "]");
}