in sources/cg_json_schema.c [1522:1639]
static void cg_json_table(charbuf *output, ast_node *ast) {
Invariant(is_ast_create_table_stmt(ast));
EXTRACT_NOTNULL(create_table_name_flags, ast->left);
EXTRACT_NOTNULL(table_flags_attrs, create_table_name_flags->left);
EXTRACT_OPTION(flags, table_flags_attrs->left);
EXTRACT_STRING(name, create_table_name_flags->right);
EXTRACT_ANY_NOTNULL(col_key_list, ast->right);
int32_t temp = flags & TABLE_IS_TEMP;
int32_t if_not_exist = flags & TABLE_IF_NOT_EXISTS;
int32_t no_rowid = flags & TABLE_IS_NO_ROWID;
ast_node *misc_attrs = NULL;
ast_node *attr_target = ast->parent;
if (is_virtual_ast(ast)) {
// for virtual tables, we have to go up past the virtual table node to get the attributes
attr_target = attr_target->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);
bprintf(output, "{\n");
BEGIN_INDENT(table, 2);
bool_t is_added = ast->sem->create_version > 0;
bool_t is_deleted = ast->sem->delete_version > 0;
bprintf(output, "\"name\" : \"%s\"", name);
bprintf(output, ",\n\"CRC\" : \"%lld\"", crc_stmt(ast));
bprintf(output, ",\n\"isTemp\" : %d", !!temp);
bprintf(output, ",\n\"ifNotExists\" : %d", !!if_not_exist);
bprintf(output, ",\n\"withoutRowid\" : %d", !!no_rowid);
bprintf(output, ",\n\"isAdded\" : %d", is_added);
if (is_added) {
bprintf(output, ",\n\"addedVersion\" : %d", ast->sem->create_version);
cg_json_added_migration_proc(output, table_flags_attrs);
}
bprintf(output, ",\n\"isDeleted\" : %d", is_deleted);
if (is_deleted) {
bprintf(output, ",\n\"deletedVersion\" : %d", ast->sem->delete_version);
cg_json_deleted_migration_proc(output, table_flags_attrs);
}
bprintf(output, ",\n\"isRecreated\": %d", ast->sem->recreate);
if (ast->sem->recreate_group_name) {
bprintf(output, ",\n\"recreateGroupName\" : \"%s\"", ast->sem->recreate_group_name);
}
if (ast->sem->unsub_version > ast->sem->resub_version) {
bprintf(output, ",\n\"unsubscribedVersion\" : %d", ast->sem->unsub_version);
}
if (ast->sem->resub_version > ast->sem->unsub_version) {
bprintf(output, ",\n\"resubscribedVersion\" : %d", ast->sem->resub_version);
}
if (ast->sem->region) {
cg_json_emit_region_info(output, ast);
}
if (is_virtual_ast(ast)) {
bprintf(output, ",\n\"isVirtual\" : 1");
bprintf(output, ",\n\"isEponymous\" : %d", !!(flags & VTAB_IS_EPONYMOUS));
EXTRACT_NOTNULL(create_virtual_table_stmt, ast->parent);
EXTRACT_NOTNULL(module_info, create_virtual_table_stmt->left);
EXTRACT_STRING(module_name, module_info->left);
EXTRACT_ANY(module_args, module_info->right);
bprintf(output, ",\n\"module\" : \"%s\"", module_name);
if (module_args) {
bprintf(output, ",\n\"moduleArgs\" : ");
if (is_ast_following(module_args)) {
CHARBUF_OPEN(sql);
gen_set_output_buffer(&sql);
gen_sql_callbacks callbacks;
init_gen_sql_callbacks(&callbacks);
gen_with_callbacks(col_key_list, gen_col_key_list, &callbacks);
cg_encode_json_string_literal(sql.ptr, output);
CHARBUF_CLOSE(sql);
}
else {
CHARBUF_OPEN(sql);
gen_set_output_buffer(&sql);
gen_sql_callbacks callbacks;
init_gen_sql_callbacks(&callbacks);
gen_with_callbacks(module_args, gen_misc_attr_value_list, &callbacks);
cg_encode_json_string_literal(sql.ptr, output);
CHARBUF_CLOSE(sql);
}
}
}
CONTINUE_LIST;
if (ast->sem->index_list) {
COMMA;
cg_json_table_indices(ast->sem->index_list, output);
}
if (misc_attrs) {
COMMA;
cg_json_misc_attrs(output, misc_attrs);
}
COMMA;
cg_json_col_key_list(output, col_key_list);
END_INDENT(table);
END_LIST;
bprintf(output, "}");
}