28
28
#include <drizzled/error.h>
29
29
#include <drizzled/gettext.h>
31
#include "drizzled/plugin/transactional_storage_engine.h"
32
#include "drizzled/plugin/authorization.h"
31
#include "drizzled/plugin/info_schema_table.h"
33
32
#include <drizzled/nested_join.h>
34
33
#include <drizzled/sql_parse.h>
35
34
#include <drizzled/item/sum.h>
80
79
return (unsigned char*) (*buff)->field_name;
82
static TABLE_CATEGORY get_table_category(const LEX_STRING *db)
86
if ((db->length == INFORMATION_SCHEMA_NAME.length()) &&
87
(my_strcasecmp(system_charset_info,
88
INFORMATION_SCHEMA_NAME.c_str(),
91
return TABLE_CATEGORY_INFORMATION;
94
return TABLE_CATEGORY_USER;
84
99
Allocate a setup TableShare structure
100
115
memory::Root mem_root;
101
116
TableShare *share;
102
117
char *key_buff, *path_buff;
105
build_table_filename(path, table_list->db, table_list->table_name, false);
118
char path[FN_REFLEN];
119
uint32_t path_length;
121
path_length= build_table_filename(path, sizeof(path) - 1,
123
table_list->table_name, false);
107
124
memory::init_sql_alloc(&mem_root, TABLE_ALLOC_BLOCK_SIZE, 0);
108
125
if (multi_alloc_root(&mem_root,
109
126
&share, sizeof(*share),
110
127
&key_buff, key_length,
111
&path_buff, path.length() + 1,
128
&path_buff, path_length + 1,
114
131
memset(share, 0, sizeof(*share));
116
133
share->set_table_cache_key(key_buff, key, key_length);
118
share->path.str= path_buff,
119
share->path.length= path.length();
120
strcpy(share->path.str, path.c_str());
135
share->path.str= path_buff;
136
share->path.length= path_length;
137
strcpy(share->path.str, path);
121
138
share->normalized_path.str= share->path.str;
122
share->normalized_path.length= path.length();
139
share->normalized_path.length= path_length;
124
141
share->version= refresh_version;
513
530
case DRIZZLE_TYPE_ENUM:
515
message::Table::Field::EnumerationValues field_options= pfield.enumeration_values();
532
message::Table::Field::SetFieldOptions field_options= pfield.set_options();
517
534
field_pack_length[fieldnr]=
518
535
get_enum_pack_length(field_options.field_value_size());
614
631
if (pfield.type() != message::Table::Field::ENUM)
617
message::Table::Field::EnumerationValues field_options= pfield.enumeration_values();
634
message::Table::Field::SetFieldOptions field_options= pfield.set_options();
619
636
const CHARSET_INFO *charset= get_charset(field_options.has_collation_id() ?
620
637
field_options.collation_id() : 0);
762
779
if (field_type == DRIZZLE_TYPE_ENUM)
764
message::Table::Field::EnumerationValues field_options= pfield.enumeration_values();
781
message::Table::Field::SetFieldOptions field_options= pfield.set_options();
766
783
charset= get_charset(field_options.has_collation_id()?
767
784
field_options.collation_id() : 0);
876
message::Table::Field::EnumerationValues fo= pfield.enumeration_values();
893
message::Table::Field::SetFieldOptions fo= pfield.set_options();
878
for (int valnr= 0; valnr < fo.field_value_size(); valnr++)
895
for(int valnr= 0; valnr < fo.field_value_size(); valnr++)
880
897
if (fo.field_value(valnr).length() > field_length)
882
898
field_length= charset->cset->numchars(charset,
883
899
fo.field_value(valnr).c_str(),
884
900
fo.field_value(valnr).c_str()
885
901
+ fo.field_value(valnr).length())
886
902
* charset->mbmaxlen;
891
906
case DRIZZLE_TYPE_LONG:
893
908
uint32_t sign_len= pfield.constraints().is_unsigned() ? 0 : 1;
1250
1265
message::Table table;
1252
error= plugin::StorageEngine::getTableDefinition(session, identifier, table);
1267
error= plugin::StorageEngine::getTableDefinition(session, share->normalized_path.str,
1269
share->table_name.str,
1254
1273
if (error != EEXIST)
1263
if (not table.IsInitialized())
1282
if (!table.IsInitialized())
1271
1290
error= parse_table_proto(session, table, share);
1273
share->table_category= TABLE_CATEGORY_USER;
1292
share->table_category= get_table_category(& share->db);
1295
session.status_var.opened_shares++;
1276
1298
if (error && !error_given)
1324
1346
outparam->resetTable(session, share, db_stat);
1327
if (not (outparam->alias= strdup(alias)))
1349
if (!(outparam->alias= strdup(alias)))
1330
1352
/* Allocate Cursor */
1331
if (not (outparam->cursor= share->db_type()->getCursor(*share, &outparam->mem_root)))
1353
if (!(outparam->cursor= share->db_type()->getCursor(*share, &outparam->mem_root)))
1672
1696
my_error(ER_NO_SUCH_TABLE, MYF(0), db.str, table_name.str);
1675
snprintf(buff, sizeof(buff), "%s",normalized_path.str);
1699
sprintf(buff,"%s",normalized_path.str);
1676
1700
my_error((db_errno == EMFILE) ? ER_CANT_OPEN_FILE : ER_FILE_NOT_FOUND,
1677
1701
errortype, buff, db_errno);
1693
1717
err_no= (db_errno == ENOENT) ? ER_FILE_NOT_FOUND : (db_errno == EAGAIN) ?
1694
1718
ER_FILE_USED : ER_CANT_OPEN_FILE;
1695
snprintf(buff, sizeof(buff), "%s%s", normalized_path.str,datext);
1719
sprintf(buff,"%s%s", normalized_path.str,datext);
1696
1720
my_error(err_no,errortype, buff, db_errno);
1715
snprintf(buff, sizeof(buff), "%s", normalized_path.str);
1739
sprintf(buff,"%s", normalized_path.str);
1716
1740
my_printf_error(ER_NOT_FORM_FILE,
1717
1741
_("Table '%-.64s' was created with a different version "
1718
1742
"of Drizzle and cannot be read"),
1723
1747
default: /* Better wrong error than none */
1725
snprintf(buff, sizeof(buff), "%s", normalized_path.str);
1749
sprintf(buff,"%s", normalized_path.str);
1726
1750
my_error(ER_NOT_FORM_FILE, errortype, buff, 0);
1918
1942
org_name Name of database and length
1925
bool check_db_name(SchemaIdentifier &schema_identifier)
1949
bool check_db_name(LEX_STRING *org_name)
1927
if (not plugin::Authorization::isAuthorized(current_session->getSecurityContext(), schema_identifier))
1932
return schema_identifier.isValid();
1951
char *name= org_name->str;
1952
uint32_t name_length= org_name->length;
1954
if (!name_length || name_length > NAME_LEN || name[name_length - 1] == ' ')
1957
my_casedn_str(files_charset_info, name);
1959
return check_identifier_name(org_name);
3286
3313
session->set_proc_info("removing tmp table");
3288
3315
// Release latches since this can take a long time
3289
plugin::TransactionalStorageEngine::releaseTemporaryLatches(session);
3316
plugin::StorageEngine::releaseTemporaryLatches(session);
3294
3321
cursor->closeMarkForDelete(s->table_name.str);
3296
TableIdentifier identifier(s->getSchemaName(), s->table_name.str, s->table_name.str);
3297
s->db_type()->doDropTable(*session, identifier);
3323
s->db_type()->doDropTable(*session, s->table_name.str);
3333
3359
// Release latches since this can take a long time
3334
plugin::TransactionalStorageEngine::releaseTemporaryLatches(session);
3360
plugin::StorageEngine::releaseTemporaryLatches(session);
3336
3362
new_table= *table;
3337
3363
share= *table->s;
3338
3364
new_table.s= &share;
3339
3365
new_table.s->storage_engine= myisam_engine;
3340
if (not (new_table.cursor= new_table.s->db_type()->getCursor(share, &new_table.mem_root)))
3366
if (!(new_table.cursor= new_table.s->db_type()->getCursor(share, &new_table.mem_root)))
3341
3367
return true; // End of memory
3343
3369
save_proc_info=session->get_proc_info();
3405
3431
table->print_error(write_err, MYF(0));
3406
3432
(void) table->cursor->ha_rnd_end();
3407
3433
(void) new_table.cursor->close();
3411
TableIdentifier identifier(new_table.s->getSchemaName(), new_table.s->table_name.str, new_table.s->table_name.str);
3412
new_table.s->db_type()->doDropTable(*session, identifier);
3435
new_table.s->db_type()->doDropTable(*session, new_table.s->table_name.str);
3416
3437
delete new_table.cursor;
3417
3438
session->set_proc_info(save_proc_info);
3670
3691
session->slave_proxy_id, separated by '\0'.
3673
bool Table::renameAlterTemporaryTable(TableIdentifier &identifier)
3694
bool Table::rename_temporary_table(const char *db, const char *table_name)
3676
3697
uint32_t key_length;
3677
3698
TableShare *share= s;
3679
if (not (key=(char*) alloc_root(&share->mem_root, MAX_DBKEY_LENGTH)))
3700
if (!(key=(char*) alloc_root(&share->mem_root, MAX_DBKEY_LENGTH)))
3682
key_length= TableShare::createKey(key, identifier);
3703
key_length= TableShare::createKey(key, db, table_name);
3683
3704
share->set_table_cache_key(key, key_length);
3685
message::Table *message= share->getTableProto();
3687
message->set_name(identifier.getTableName());
3688
message->set_schema(identifier.getSchemaName());