Inception的SQL解析过程继承自MySQL,只要是MySQL支持的语法,它也能支持。Inception对SQL的审核是在MySQL的词法、语法解析过程中对审核选项进行判断的。
Inception的审核内容可以分为以下几类:
- SQL的词法检查,例如检查某个表存不存在,关键字正不正确,字段的长度等等。
- SQL的语法检查,例如是否有注释,主键的个数,索引的个数,字段的个数,字段是否有默认值,是否允许自己设置字符集。
Inception中对所有审核配置项的信息可以在mysql命令行下通过执行inception get variables来查看,在代码中,都放置在inception-src\sql\sys_vars.cc文件中:
static Sys_var_charptr Sys_remote_bak_host( "inception_remote_backup_host", "the host of remote backup.", READ_ONLY GLOBAL_VAR(remote_backup_host), CMD_LINE(REQUIRED_ARG), IN_FS_CHARSET, DEFAULT("localhost")); static Sys_var_uint Sys_remote_bak_port( "inception_remote_backup_port", "Port number to use for remote backup.", READ_ONLY GLOBAL_VAR(remote_backup_port), CMD_LINE(REQUIRED_ARG), VALID_RANGE(0, UINT_MAX32), DEFAULT(0), BLOCK_SIZE(1)); ...................... static Sys_var_charptr Sys_inception_support_charset( "inception_support_charset", "check charset when create table or alter, set multi charset use comma to concat", GLOBAL_VAR(inception_support_charset), CMD_LINE(REQUIRED_ARG), IN_FS_CHARSET, DEFAULT("utf8mb4"), NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(check_charset)); static Sys_var_mybool Sys_inception_check_table_comment( "inception_check_table_comment", "check comment when create table", GLOBAL_VAR(inception_check_table_comment), CMD_LINE(OPT_ARG), DEFAULT(TRUE));
对于这些定义的审核参数对应的使用位置,可以从SQL的词法及语法解析后的逻辑层中查看到:
1 int 2 mysql_check_inception_variables( 3 THD * thd 4 ) 5 { 6 switch(thd->get_stmt_da()->sql_errno()) 7 { 8 case ER_WITH_INSERT_FIELD: 9 if (inception_check_insert_field) 10 return true; 11 else 12 return false; 13 break; 14 15 case ER_NO_WHERE_CONDITION: 16 if (inception_check_dml_where) 17 return true; 18 else 19 return false; 20 break; 21 22 case ER_WITH_LIMIT_CONDITION: 23 if (inception_check_dml_limit) 24 return true; 25 else 26 return false; 27 break; 28 29 case ER_WITH_ORDERBY_CONDITION: 30 if (inception_check_dml_orderby) 31 return true; 32 else 33 return false; 34 break; 35 36 case ER_SELECT_ONLY_STAR: 37 if (inception_enable_select_star) 38 return false; 39 break; 40 41 case ER_ORDERY_BY_RAND: 42 if (inception_enable_orderby_rand) 43 return false; 44 break; 45 46 case ER_NOT_ALLOWED_NULLABLE: 47 if (inception_enable_nullable) 48 return false; 49 break; 50 51 case ER_FOREIGN_KEY: 52 if (inception_enable_foreign_key) 53 return false; 54 break; 55 56 case ER_USE_TEXT_OR_BLOB: 57 if (inception_enable_blob_type) 58 return false; 59 break; 60 61 case ER_TABLE_MUST_INNODB: 62 if (inception_enable_not_innodb) 63 return false; 64 break; 65 66 67 case ER_TABLE_MUST_HAVE_COMMENT: 68 if (inception_check_table_comment) 69 return true; 70 else 71 return false; 72 break; 73 74 case ER_COLUMN_HAVE_NO_COMMENT: 75 if (inception_check_column_comment) 76 return true; 77 else 78 return false; 79 break; 80 81 case ER_TABLE_MUST_HAVE_PK: 82 if (inception_check_primary_key) 83 return true; 84 else 85 return false; 86 break; 87 88 case ER_PARTITION_NOT_ALLOWED: 89 if (inception_enable_partition_table) 90 return false; 91 break; 92 93 case ER_USE_ENUM: 94 case ER_INVALID_DATA_TYPE: 95 if (inception_enable_enum_set_bit) 96 return false; 97 break; 98 99 case ER_INDEX_NAME_IDX_PREFIX: 100 case ER_INDEX_NAME_UNIQ_PREFIX: 101 if (inception_check_index_prefix) 102 return true; 103 else 104 return false; 105 break; 106 107 case ER_AUTOINC_UNSIGNED: 108 if (inception_enable_autoincrement_unsigned) 109 return true; 110 else 111 return false; 112 break; 113 114 case ER_INC_INIT_ERR: 115 if (inception_check_autoincrement_init_value) 116 return true; 117 else 118 return false; 119 break; 120 case ER_INVALID_IDENT: 121 if (inception_check_identifier) 122 return true; 123 else 124 return false; 125 break; 126 127 case ER_SET_DATA_TYPE_INT_BIGINT: 128 if (inception_check_autoincrement_datatype) 129 return true; 130 else 131 return false; 132 break; 133 134 case ER_TIMESTAMP_DEFAULT: 135 if (inception_check_timestamp_default) 136 return true; 137 else 138 return false; 139 break; 140 141 case ER_CHARSET_ON_COLUMN: 142 if (inception_enable_column_charset) 143 return false; 144 break; 145 146 case ER_IDENT_USE_KEYWORD: 147 if (inception_enable_identifer_keyword) 148 return false; 149 break; 150 151 case ER_AUTO_INCR_ID_WARNING: 152 if (inception_check_autoincrement_name) 153 return true; 154 else 155 return false; 156 break; 157 158 case ER_ALTER_TABLE_ONCE: 159 if (inception_merge_alter_table) 160 return true; 161 else 162 return false; 163 break; 164 165 case ER_WITH_DEFAULT_ADD_COLUMN: 166 if (inception_check_column_default_value) 167 return true; 168 else 169 return false; 170 break; 171 172 default: 173 return true; 174 } 175 176 return true; 177 }
Inception对SQL的词法检查有这样一些选项:
inception_check_index_prefix | 检查索引名称的前缀 |
inception_max_char_length | 检查char类型的最大长度 |
inception_enable_identifer_keyword | 是否允许标识符使用关键字 |
inception_check_identifier | 检查标识符的格式 |
Inception对SQL的语法检查的选项:
inception_check_insert_field | 检查insert的字段 |
inception_check_dml_where | 检查DML语句是否有where条件 |
inception_check_dml_limit | 检查DML是否有limit语句 |
inception_check_dml_orderby | 检查DML是否有orderby语句 |
inception_enable_select_star | select语句中是否允许有*号 |
inception_enable_orderby_rand | select语句中是否允许有order by |
inception_enable_nullable | 是否允许有nullable |
inception_enable_foreign_key | 是否允许外键 |
inception_max_key_parts | 最大的组合主键数量 |
inception_max_update_rows | 一次更新的最大记录数 |
inception_max_keys | 单个表中索引的最大数量 |
inception_enable_not_innodb | 是否允许非InnoDB的表创建 |
inception_support_charset | 在建表或建库时默认支持的字符集 |
inception_check_table_comment | 是否检查表的注释 |
inception_check_column_comment | 是否检查列的注释 |
inception_check_primary_key | 是否检查是否有主键 |
inception_enable_partition_table | 是否支持分区表 |
inception_enable_blob_type | 是否支持blob类型 |
inception_enable_enum_set_bit | 是否支持enmu,set,bit类型 |
inception_enable_autoincrement_unsigned | 是否支持无符号的自增类型字段 |
inception_check_autoincrement_init_value | 是否检查自增类型字段的初始值 |
inception_check_autoincrement_datatype | 是否检查自增类型字段的数据类型 |
inception_check_timestamp_default | 是否检查timestamp的默认值 |
inception_enable_column_charset | 是否允许指定列的字符集 |
inception_check_autoincrement_name | 是否检查自增列的名称 |
inception_check_column_default_value | 是否检查列的默认值 |
Inception的其他一些控制配置项:
inception_merge_alter_table | 将对同一张表的多个alter table操作合并为一个alter操作 |
inception_enable_sql_statistic | 是否开启统计功能 |
inception_osc_bin_dir | 指定osc的目录 |
inception_osc_print_sql | 指定ocs时是否输出sql语句 |
inception_osc_print_none | |
inception_read_only | 指定Inception不能修改线上库的任何数据 |
inception_ddl_support | 指定是否允许Inception进行线上的ddl操作 |
inception_osc_on | 指定是否允许使用ocs功能 |
Inception的审核是在逻辑层进行的,相当于原来的MySQL中生成物理执行计划的层面,在该层面上,所有的审核项都是先进行收集,然后再由统一的函数来对它们的开关打开与否进行判断,如果选项是打开的,则在判断函数来进行汇总,没有打开就忽略收集到的该审核项的信息。
时间: 2024-12-13 03:14:15