This graph shows which files directly or indirectly include this file:

Go to the source code of this file.
Typedefs | |
| typedef st_ha_create_information | HA_CREATE_INFO |
| typedef st_table_list | TABLE_LIST |
Functions | |
| int | store_create_info (THD *thd, TABLE_LIST *table_list, String *packet, HA_CREATE_INFO *create_info_arg) |
| int | view_store_create_info (THD *thd, TABLE_LIST *table, String *buff) |
Definition at line 9 of file sql_show.h.
| typedef st_table_list TABLE_LIST |
Definition at line 11 of file sql_show.h.
| int store_create_info | ( | THD * | thd, | |
| TABLE_LIST * | table_list, | |||
| String * | packet, | |||
| HA_CREATE_INFO * | create_info_arg | |||
| ) |
Definition at line 1010 of file sql_show.cc.
References st_table::alias, String::append(), handler::append_create_info(), append_directory(), append_identifier(), append_unescaped(), st_table_share::avg_row_length, bzero, Field::charset(), st_table_share::comment, Field::comment, st_table_share::connect_string, charset_info_st::csname, st_table_share::db_create_options, DBUG_ENTER, DBUG_PRINT, DBUG_RETURN, FALSE, st_table::field, Field::field_name, FIELD_TYPE_BLOB, FIELD_TYPE_TIMESTAMP, st_table::file, st_key::flags, Field::flags, flags, handler::free_foreign_key_create_info(), generate_partition_syntax(), handler::get_foreign_key_create_info(), handler::get_tablespace_name(), HA_CREATE_USED_DEFAULT_CHARSET, HA_CREATE_USED_ENGINE, HA_FULLTEXT, HA_NOSAME, HA_OPTION_CHECKSUM, HA_OPTION_DELAY_KEY_WRITE, HA_OPTION_NO_PACK_KEYS, HA_OPTION_PACK_KEYS, ha_resolve_storage_engine_name(), ha_row_type, HA_SPATIAL, Field::has_charset(), int10_to_str(), Field::is_null(), st_table_share::key_block_size, st_table::key_info, Field::key_length(), st_key::key_part, st_key::key_parts, st_table_share::keys, LEX_STRING::length, longlong10_to_str, lower_case_table_names, MAX_FIELD_WIDTH, st_table_share::max_rows, Field::maybe_null(), st_table_share::min_rows, MODE_ANSI, MODE_DB2, MODE_MAXDB, MODE_MSSQL, MODE_MYSQL323, MODE_MYSQL40, MODE_NO_FIELD_OPTIONS, MODE_NO_TABLE_OPTIONS, MODE_ORACLE, MODE_POSTGRESQL, MY_CS_PRIMARY, my_free, MYF, st_plugin_int::name, st_key::name, charset_info_st::name, NAME_LEN, Field::NEXT_NUMBER, NO_DEFAULT_VALUE_FLAG, NOT_NULL_FLAG, st_key::parser, st_table_share::primary_key, primary_key_name, String::ptr(), st_table::read_set, restore_record, st_table_share::row_type, ROW_TYPE_DEFAULT, st_table::s, st_table_list::schema_table, Field::sql_type(), charset_info_st::state, store_key_options(), LEX_STRING::str, strcmp(), STRING_WITH_LEN, strlen(), system_charset_info, st_table_list::table, st_table_share::table_charset, st_schema_table::table_name, st_table_share::table_name, handler::table_type(), Field::TIMESTAMP_DN_FIELD, st_table::timestamp_field, Field::TIMESTAMP_UN_FIELD, tmp_restore_column_map(), st_table_share::tmp_table, tmp_use_all_columns(), TRUE, Field::type(), show_column_type_st::type, Field::unireg_check, handler::update_create_info(), st_ha_create_information::used_fields, and Field::val_str().
Referenced by mysql_create_like_table(), mysqld_dump_create_info(), and mysqld_show_create().
01012 { 01013 List<Item> field_list; 01014 char tmp[MAX_FIELD_WIDTH], *for_str, buff[128], *end, uname[NAME_LEN*3+1]; 01015 const char *alias; 01016 String type(tmp, sizeof(tmp), system_charset_info); 01017 Field **ptr,*field; 01018 uint primary_key; 01019 KEY *key_info; 01020 TABLE *table= table_list->table; 01021 handler *file= table->file; 01022 TABLE_SHARE *share= table->s; 01023 HA_CREATE_INFO create_info; 01024 bool show_table_options= FALSE; 01025 bool foreign_db_mode= (thd->variables.sql_mode & (MODE_POSTGRESQL | 01026 MODE_ORACLE | 01027 MODE_MSSQL | 01028 MODE_DB2 | 01029 MODE_MAXDB | 01030 MODE_ANSI)) != 0; 01031 bool limited_mysql_mode= (thd->variables.sql_mode & (MODE_NO_FIELD_OPTIONS | 01032 MODE_MYSQL323 | 01033 MODE_MYSQL40)) != 0; 01034 my_bitmap_map *old_map; 01035 DBUG_ENTER("store_create_info"); 01036 DBUG_PRINT("enter",("table: %s", table->s->table_name.str)); 01037 01038 restore_record(table, s->default_values); // Get empty record 01039 01040 if (share->tmp_table) 01041 packet->append(STRING_WITH_LEN("CREATE TEMPORARY TABLE ")); 01042 else 01043 packet->append(STRING_WITH_LEN("CREATE TABLE ")); 01044 if (table_list->schema_table) 01045 alias= table_list->schema_table->table_name; 01046 else 01047 { 01048 if (lower_case_table_names == 2) 01049 alias= table->alias; 01050 else 01051 { 01052 alias= share->table_name.str; 01053 } 01054 } 01055 append_identifier(thd, packet, alias, strlen(alias)); 01056 packet->append(STRING_WITH_LEN(" (\n")); 01057 /* 01058 We need this to get default values from the table 01059 We have to restore the read_set if we are called from insert in case 01060 of row based replication. 01061 */ 01062 old_map= tmp_use_all_columns(table, table->read_set); 01063 01064 for (ptr=table->field ; (field= *ptr); ptr++) 01065 { 01066 bool has_default; 01067 bool has_now_default; 01068 uint flags = field->flags; 01069 01070 if (ptr != table->field) 01071 packet->append(STRING_WITH_LEN(",\n")); 01072 01073 packet->append(STRING_WITH_LEN(" ")); 01074 append_identifier(thd,packet,field->field_name, strlen(field->field_name)); 01075 packet->append(' '); 01076 // check for surprises from the previous call to Field::sql_type() 01077 if (type.ptr() != tmp) 01078 type.set(tmp, sizeof(tmp), system_charset_info); 01079 else 01080 type.set_charset(system_charset_info); 01081 01082 field->sql_type(type); 01083 packet->append(type.ptr(), type.length(), system_charset_info); 01084 01085 if (field->has_charset() && 01086 !(thd->variables.sql_mode & (MODE_MYSQL323 | MODE_MYSQL40))) 01087 { 01088 if (field->charset() != share->table_charset) 01089 { 01090 packet->append(STRING_WITH_LEN(" CHARACTER SET ")); 01091 packet->append(field->charset()->csname); 01092 } 01093 /* 01094 For string types dump collation name only if 01095 collation is not primary for the given charset 01096 */ 01097 if (!(field->charset()->state & MY_CS_PRIMARY)) 01098 { 01099 packet->append(STRING_WITH_LEN(" COLLATE ")); 01100 packet->append(field->charset()->name); 01101 } 01102 } 01103 01104 if (flags & NOT_NULL_FLAG) 01105 packet->append(STRING_WITH_LEN(" NOT NULL")); 01106 else if (field->type() == FIELD_TYPE_TIMESTAMP) 01107 { 01108 /* 01109 TIMESTAMP field require explicit NULL flag, because unlike 01110 all other fields they are treated as NOT NULL by default. 01111 */ 01112 packet->append(STRING_WITH_LEN(" NULL")); 01113 } 01114 01115 /* 01116 Again we are using CURRENT_TIMESTAMP instead of NOW because it is 01117 more standard 01118 */ 01119 has_now_default= table->timestamp_field == field && 01120 field->unireg_check != Field::TIMESTAMP_UN_FIELD; 01121 01122 has_default= (field->type() != FIELD_TYPE_BLOB && 01123 !(field->flags & NO_DEFAULT_VALUE_FLAG) && 01124 field->unireg_check != Field::NEXT_NUMBER && 01125 !((thd->variables.sql_mode & (MODE_MYSQL323 | MODE_MYSQL40)) 01126 && has_now_default)); 01127 01128 if (has_default) 01129 { 01130 packet->append(STRING_WITH_LEN(" DEFAULT ")); 01131 if (has_now_default) 01132 packet->append(STRING_WITH_LEN("CURRENT_TIMESTAMP")); 01133 else if (!field->is_null()) 01134 { // Not null by default 01135 type.set(tmp, sizeof(tmp), field->charset()); 01136 field->val_str(&type); 01137 if (type.length()) 01138 { 01139 String def_val; 01140 uint dummy_errors; 01141 /* convert to system_charset_info == utf8 */ 01142 def_val.copy(type.ptr(), type.length(), field->charset(), 01143 system_charset_info, &dummy_errors); 01144 append_unescaped(packet, def_val.ptr(), def_val.length()); 01145 } 01146 else 01147 packet->append(STRING_WITH_LEN("''")); 01148 } 01149 else if (field->maybe_null()) 01150 packet->append(STRING_WITH_LEN("NULL")); // Null as default 01151 else 01152 packet->append(tmp); 01153 } 01154 01155 if (!limited_mysql_mode && table->timestamp_field == field && 01156 field->unireg_check != Field::TIMESTAMP_DN_FIELD) 01157 packet->append(STRING_WITH_LEN(" ON UPDATE CURRENT_TIMESTAMP")); 01158 01159 if (field->unireg_check == Field::NEXT_NUMBER && 01160 !(thd->variables.sql_mode & MODE_NO_FIELD_OPTIONS)) 01161 packet->append(STRING_WITH_LEN(" AUTO_INCREMENT")); 01162 01163 if (field->comment.length) 01164 { 01165 packet->append(STRING_WITH_LEN(" COMMENT ")); 01166 append_unescaped(packet, field->comment.str, field->comment.length); 01167 } 01168 } 01169 01170 key_info= table->key_info; 01171 bzero((char*) &create_info, sizeof(create_info)); 01172 file->update_create_info(&create_info); 01173 primary_key= share->primary_key; 01174 01175 for (uint i=0 ; i < share->keys ; i++,key_info++) 01176 { 01177 KEY_PART_INFO *key_part= key_info->key_part; 01178 bool found_primary=0; 01179 packet->append(STRING_WITH_LEN(",\n ")); 01180 01181 if (i == primary_key && !strcmp(key_info->name, primary_key_name)) 01182 { 01183 found_primary=1; 01184 /* 01185 No space at end, because a space will be added after where the 01186 identifier would go, but that is not added for primary key. 01187 */ 01188 packet->append(STRING_WITH_LEN("PRIMARY KEY")); 01189 } 01190 else if (key_info->flags & HA_NOSAME) 01191 packet->append(STRING_WITH_LEN("UNIQUE KEY ")); 01192 else if (key_info->flags & HA_FULLTEXT) 01193 packet->append(STRING_WITH_LEN("FULLTEXT KEY ")); 01194 else if (key_info->flags & HA_SPATIAL) 01195 packet->append(STRING_WITH_LEN("SPATIAL KEY ")); 01196 else 01197 packet->append(STRING_WITH_LEN("KEY ")); 01198 01199 if (!found_primary) 01200 append_identifier(thd, packet, key_info->name, strlen(key_info->name)); 01201 01202 packet->append(STRING_WITH_LEN(" (")); 01203 01204 for (uint j=0 ; j < key_info->key_parts ; j++,key_part++) 01205 { 01206 if (j) 01207 packet->append(','); 01208 01209 if (key_part->field) 01210 append_identifier(thd,packet,key_part->field->field_name, 01211 strlen(key_part->field->field_name)); 01212 if (key_part->field && 01213 (key_part->length != 01214 table->field[key_part->fieldnr-1]->key_length() && 01215 !(key_info->flags & HA_FULLTEXT))) 01216 { 01217 char *end; 01218 buff[0] = '('; 01219 end= int10_to_str((long) key_part->length / 01220 key_part->field->charset()->mbmaxlen, 01221 buff + 1,10); 01222 *end++ = ')'; 01223 packet->append(buff,(uint) (end-buff)); 01224 } 01225 } 01226 packet->append(')'); 01227 store_key_options(thd, packet, table, key_info); 01228 if (key_info->parser) 01229 { 01230 packet->append(" WITH PARSER ", 13); 01231 append_identifier(thd, packet, key_info->parser->name.str, 01232 key_info->parser->name.length); 01233 } 01234 } 01235 01236 /* 01237 Get possible foreign key definitions stored in InnoDB and append them 01238 to the CREATE TABLE statement 01239 */ 01240 01241 if ((for_str= file->get_foreign_key_create_info())) 01242 { 01243 packet->append(for_str, strlen(for_str)); 01244 file->free_foreign_key_create_info(for_str); 01245 } 01246 01247 packet->append(STRING_WITH_LEN("\n)")); 01248 if (!(thd->variables.sql_mode & MODE_NO_TABLE_OPTIONS) && !foreign_db_mode) 01249 { 01250 show_table_options= TRUE; 01251 /* 01252 Get possible table space definitions and append them 01253 to the CREATE TABLE statement 01254 */ 01255 01256 if ((for_str= file->get_tablespace_name(thd))) 01257 { 01258 packet->append(" TABLESPACE "); 01259 packet->append(for_str, strlen(for_str)); 01260 packet->append(" STORAGE DISK"); 01261 my_free(for_str, MYF(0)); 01262 } 01263 01264 /* 01265 IF check_create_info 01266 THEN add ENGINE only if it was used when creating the table 01267 */ 01268 if (!create_info_arg || 01269 (create_info_arg->used_fields & HA_CREATE_USED_ENGINE)) 01270 { 01271 if (thd->variables.sql_mode & (MODE_MYSQL323 | MODE_MYSQL40)) 01272 packet->append(STRING_WITH_LEN(" TYPE=")); 01273 else 01274 packet->append(STRING_WITH_LEN(" ENGINE=")); 01275 #ifdef WITH_PARTITION_STORAGE_ENGINE 01276 if (table->part_info) 01277 packet->append(ha_resolve_storage_engine_name( 01278 table->part_info->default_engine_type)); 01279 else 01280 packet->append(file->table_type()); 01281 #else 01282 packet->append(file->table_type()); 01283 #endif 01284 } 01285 01286 /* 01287 Add AUTO_INCREMENT=... if there is an AUTO_INCREMENT column, 01288 and NEXT_ID > 1 (the default). We must not print the clause 01289 for engines that do not support this as it would break the 01290 import of dumps, but as of this writing, the test for whether 01291 AUTO_INCREMENT columns are allowed and wether AUTO_INCREMENT=... 01292 is supported is identical, !(file->table_flags() & HA_NO_AUTO_INCREMENT)) 01293 Because of that, we do not explicitly test for the feature, 01294 but may extrapolate its existence from that of an AUTO_INCREMENT column. 01295 */ 01296 01297 if(create_info.auto_increment_value > 1) 01298 { 01299 packet->append(" AUTO_INCREMENT=", 16); 01300 end= longlong10_to_str(create_info.auto_increment_value, buff,10); 01301 packet->append(buff, (uint) (end - buff)); 01302 } 01303 01304 01305 if (share->table_charset && 01306 !(thd->variables.sql_mode & MODE_MYSQL323) && 01307 !(thd->variables.sql_mode & MODE_MYSQL40)) 01308 { 01309 /* 01310 IF check_create_info 01311 THEN add DEFAULT CHARSET only if it was used when creating the table 01312 */ 01313 if (!create_info_arg || 01314 (create_info_arg->used_fields & HA_CREATE_USED_DEFAULT_CHARSET)) 01315 { 01316 packet->append(STRING_WITH_LEN(" DEFAULT CHARSET=")); 01317 packet->append(share->table_charset->csname); 01318 if (!(share->table_charset->state & MY_CS_PRIMARY)) 01319 { 01320 packet->append(STRING_WITH_LEN(" COLLATE=")); 01321 packet->append(table->s->table_charset->name); 01322 } 01323 } 01324 } 01325 01326 if (share->min_rows) 01327 { 01328 packet->append(STRING_WITH_LEN(" MIN_ROWS=")); 01329 end= longlong10_to_str(share->min_rows, buff, 10); 01330 packet->append(buff, (uint) (end- buff)); 01331 } 01332 01333 if (share->max_rows && !table_list->schema_table) 01334 { 01335 packet->append(STRING_WITH_LEN(" MAX_ROWS=")); 01336 end= longlong10_to_str(share->max_rows, buff, 10); 01337 packet->append(buff, (uint) (end - buff)); 01338 } 01339 01340 if (share->avg_row_length) 01341 { 01342 packet->append(STRING_WITH_LEN(" AVG_ROW_LENGTH=")); 01343 end= longlong10_to_str(share->avg_row_length, buff,10); 01344 packet->append(buff, (uint) (end - buff)); 01345 } 01346 01347 if (share->db_create_options & HA_OPTION_PACK_KEYS) 01348 packet->append(STRING_WITH_LEN(" PACK_KEYS=1")); 01349 if (share->db_create_options & HA_OPTION_NO_PACK_KEYS) 01350 packet->append(STRING_WITH_LEN(" PACK_KEYS=0")); 01351 if (share->db_create_options & HA_OPTION_CHECKSUM) 01352 packet->append(STRING_WITH_LEN(" CHECKSUM=1")); 01353 if (share->db_create_options & HA_OPTION_DELAY_KEY_WRITE) 01354 packet->append(STRING_WITH_LEN(" DELAY_KEY_WRITE=1")); 01355 if (share->row_type != ROW_TYPE_DEFAULT) 01356 { 01357 packet->append(STRING_WITH_LEN(" ROW_FORMAT=")); 01358 packet->append(ha_row_type[(uint) share->row_type]); 01359 } 01360 if (table->s->key_block_size) 01361 { 01362 packet->append(STRING_WITH_LEN(" KEY_BLOCK_SIZE=")); 01363 end= longlong10_to_str(table->s->key_block_size, buff, 10); 01364 packet->append(buff, (uint) (end - buff)); 01365 } 01366 table->file->append_create_info(packet); 01367 if (share->comment.length) 01368 { 01369 packet->append(STRING_WITH_LEN(" COMMENT=")); 01370 append_unescaped(packet, share->comment.str, share->comment.length); 01371 } 01372 if (share->connect_string.length) 01373 { 01374 packet->append(STRING_WITH_LEN(" CONNECTION=")); 01375 append_unescaped(packet, share->connect_string.str, share->connect_string.length); 01376 } 01377 append_directory(thd, packet, "DATA", create_info.data_file_name); 01378 append_directory(thd, packet, "INDEX", create_info.index_file_name); 01379 } 01380 #ifdef WITH_PARTITION_STORAGE_ENGINE 01381 { 01382 /* 01383 Partition syntax for CREATE TABLE is at the end of the syntax. 01384 */ 01385 uint part_syntax_len; 01386 char *part_syntax; 01387 if (table->part_info && 01388 (!table->part_info->is_auto_partitioned) && 01389 ((part_syntax= generate_partition_syntax(table->part_info, 01390 &part_syntax_len, 01391 FALSE, 01392 show_table_options)))) 01393 { 01394 packet->append(STRING_WITH_LEN(" /*!50100")); 01395 packet->append(part_syntax, part_syntax_len); 01396 packet->append(STRING_WITH_LEN(" */")); 01397 my_free(part_syntax, MYF(0)); 01398 } 01399 } 01400 #endif 01401 tmp_restore_column_map(table->read_set, old_map); 01402 DBUG_RETURN(0); 01403 }
Here is the call graph for this function:

Here is the caller graph for this function:

| int view_store_create_info | ( | THD * | thd, | |
| TABLE_LIST * | table, | |||
| String * | buff | |||
| ) |
Definition at line 1510 of file sql_show.cc.
References st_table_list::compact_view_format, FALSE, MODE_ANSI, MODE_DB2, MODE_MAXDB, MODE_MSSQL, MODE_ORACLE, MODE_POSTGRESQL, LEX_STRING::str, strcmp(), TRUE, and st_table_list::view_db.
Referenced by mysqld_show_create().
01511 { 01512 my_bool foreign_db_mode= (thd->variables.sql_mode & (MODE_POSTGRESQL | 01513 MODE_ORACLE | 01514 MODE_MSSQL | 01515 MODE_DB2 | 01516 MODE_MAXDB | 01517 MODE_ANSI)) != 0; 01518 /* 01519 Compact output format for view can be used 01520 - if user has db of this view as current db 01521 - if this view only references table inside it's own db 01522 */ 01523 if (!thd->db || strcmp(thd->db, table->view_db.str)) 01524 table->compact_view_format= FALSE; 01525 else 01526 { 01527 TABLE_LIST *tbl; 01528 table->compact_view_format= TRUE; 01529 for (tbl= thd->lex->query_tables; 01530 tbl; 01531 tbl= tbl->next_global) 01532 { 01533 if (strcmp(table->view_db.str, tbl->view ? tbl->view_db.str :tbl->db)!= 0) 01534 { 01535 table->compact_view_format= FALSE; 01536 break; 01537 } 01538 } 01539 } 01540 01541 buff->append(STRING_WITH_LEN("CREATE ")); 01542 if (!foreign_db_mode) 01543 { 01544 view_store_options(thd, table, buff); 01545 } 01546 buff->append(STRING_WITH_LEN("VIEW ")); 01547 if (!table->compact_view_format) 01548 { 01549 append_identifier(thd, buff, table->view_db.str, table->view_db.length); 01550 buff->append('.'); 01551 } 01552 append_identifier(thd, buff, table->view_name.str, table->view_name.length); 01553 buff->append(STRING_WITH_LEN(" AS ")); 01554 01555 /* 01556 We can't just use table->query, because our SQL_MODE may trigger 01557 a different syntax, like when ANSI_QUOTES is defined. 01558 */ 01559 table->view->unit.print(buff); 01560 01561 if (table->with_check != VIEW_CHECK_NONE) 01562 { 01563 if (table->with_check == VIEW_CHECK_LOCAL) 01564 buff->append(STRING_WITH_LEN(" WITH LOCAL CHECK OPTION")); 01565 else 01566 buff->append(STRING_WITH_LEN(" WITH CASCADED CHECK OPTION")); 01567 } 01568 return 0; 01569 }
Here is the call graph for this function:

Here is the caller graph for this function:

1.4.7
