Commit 75083793 authored by casualet's avatar casualet

add empty function to process the foreign key rewrite, this waits to be implemented

parent ee950f9a
...@@ -30,3 +30,8 @@ new features added ...@@ -30,3 +30,8 @@ new features added
+ timestamp + timestamp
+ show create table + show create table
obselete functions deleted
+ annotation
...@@ -11,6 +11,10 @@ ...@@ -11,6 +11,10 @@
#include <util/yield.hpp> #include <util/yield.hpp>
//a list of ddl handlers, buildddlhandler, and ddlexecutor
//################################################################Create table handler#########################################################################################
class CreateTableHandler : public DDLHandler { class CreateTableHandler : public DDLHandler {
virtual AbstractQueryExecutor * virtual AbstractQueryExecutor *
rewriteAndUpdate(Analysis &a, LEX *lex, const Preamble &pre) const rewriteAndUpdate(Analysis &a, LEX *lex, const Preamble &pre) const
...@@ -75,6 +79,7 @@ class CreateTableHandler : public DDLHandler { ...@@ -75,6 +79,7 @@ class CreateTableHandler : public DDLHandler {
//对现有的每个field, 如id,name, 都在内部通过createAndRewriteField函数扩展成多个洋葱+salt. //对现有的每个field, 如id,name, 都在内部通过createAndRewriteField函数扩展成多个洋葱+salt.
//其中洋葱有多个层, 其通过newCreateField函数, 决定了类型, 而新的field的名字, 就是洋葱的名字传过去的. //其中洋葱有多个层, 其通过newCreateField函数, 决定了类型, 而新的field的名字, 就是洋葱的名字传过去的.
//扩展以后, 就是新的Create_field类型了, 这了返回的list是被继续传到引用参数里面的, 很奇怪的用法. //扩展以后, 就是新的Create_field类型了, 这了返回的list是被继续传到引用参数里面的, 很奇怪的用法.
//key data在这里的作用是, 决定是不是unique, 从而选择和是的洋葱层次.
new_lex->alter_info.create_list = new_lex->alter_info.create_list =
accumList<Create_field>(it, accumList<Create_field>(it,
[&a, &tm, &key_data] (List<Create_field> out_list, [&a, &tm, &key_data] (List<Create_field> out_list,
...@@ -87,6 +92,7 @@ class CreateTableHandler : public DDLHandler { ...@@ -87,6 +92,7 @@ class CreateTableHandler : public DDLHandler {
// Rewrite INDEX // Rewrite INDEX
// ----------------------------- // -----------------------------
highLevelRewriteKey(*tm.get(), *lex, new_lex, a); highLevelRewriteKey(*tm.get(), *lex, new_lex, a);
highLevelRewriteForeignKey();
// ----------------------------- // -----------------------------
// Update TABLE // Update TABLE
...@@ -128,6 +134,10 @@ class CreateTableHandler : public DDLHandler { ...@@ -128,6 +134,10 @@ class CreateTableHandler : public DDLHandler {
} }
}; };
//################################################################Alter table handler#########################################################################################
// mysql does not support indiscriminate add-drops // mysql does not support indiscriminate add-drops
// ie, // ie,
// mysql> create table pk (x integer); // mysql> create table pk (x integer);
...@@ -176,6 +186,11 @@ public: ...@@ -176,6 +186,11 @@ public:
AlterTableHandler() : sub_dispatcher(buildAlterSubDispatcher()) {} AlterTableHandler() : sub_dispatcher(buildAlterSubDispatcher()) {}
}; };
//################################################################drop table handler#########################################################################################
class DropTableHandler : public DDLHandler { class DropTableHandler : public DDLHandler {
virtual AbstractQueryExecutor * virtual AbstractQueryExecutor *
rewriteAndUpdate(Analysis &a, LEX *lex, const Preamble &pre) const rewriteAndUpdate(Analysis &a, LEX *lex, const Preamble &pre) const
...@@ -219,6 +234,9 @@ class DropTableHandler : public DDLHandler { ...@@ -219,6 +234,9 @@ class DropTableHandler : public DDLHandler {
} }
}; };
//################################################################Create db handler#########################################################################################
class CreateDBHandler : public DDLHandler { class CreateDBHandler : public DDLHandler {
virtual AbstractQueryExecutor * virtual AbstractQueryExecutor *
rewriteAndUpdate(Analysis &a, LEX *const lex, const Preamble &pre) rewriteAndUpdate(Analysis &a, LEX *const lex, const Preamble &pre)
...@@ -248,6 +266,9 @@ class CreateDBHandler : public DDLHandler { ...@@ -248,6 +266,9 @@ class CreateDBHandler : public DDLHandler {
} }
}; };
//################################################################change db handler#########################################################################################
class ChangeDBHandler : public DDLHandler { class ChangeDBHandler : public DDLHandler {
virtual AbstractQueryExecutor * virtual AbstractQueryExecutor *
rewriteAndUpdate(Analysis &a, LEX *const lex, const Preamble &pre) rewriteAndUpdate(Analysis &a, LEX *const lex, const Preamble &pre)
...@@ -258,6 +279,8 @@ class ChangeDBHandler : public DDLHandler { ...@@ -258,6 +279,8 @@ class ChangeDBHandler : public DDLHandler {
} }
}; };
//################################################################drop db handler#########################################################################################
class DropDBHandler : public DDLHandler { class DropDBHandler : public DDLHandler {
virtual AbstractQueryExecutor * virtual AbstractQueryExecutor *
rewriteAndUpdate(Analysis &a, LEX *const lex, const Preamble &pre) rewriteAndUpdate(Analysis &a, LEX *const lex, const Preamble &pre)
...@@ -274,6 +297,8 @@ class DropDBHandler : public DDLHandler { ...@@ -274,6 +297,8 @@ class DropDBHandler : public DDLHandler {
} }
}; };
//################################################################lock table handler#########################################################################################
class LockTablesHandler : public DDLHandler { class LockTablesHandler : public DDLHandler {
virtual AbstractQueryExecutor * virtual AbstractQueryExecutor *
rewriteAndUpdate(Analysis &a, LEX *const lex, const Preamble &pre) rewriteAndUpdate(Analysis &a, LEX *const lex, const Preamble &pre)
...@@ -289,6 +314,8 @@ class LockTablesHandler : public DDLHandler { ...@@ -289,6 +314,8 @@ class LockTablesHandler : public DDLHandler {
} }
}; };
//################################################################Create index handler#########################################################################################
class CreateIndexHandler : public DDLHandler { class CreateIndexHandler : public DDLHandler {
virtual AbstractQueryExecutor * virtual AbstractQueryExecutor *
rewriteAndUpdate(Analysis &a, LEX *const lex, const Preamble &pre) rewriteAndUpdate(Analysis &a, LEX *const lex, const Preamble &pre)
...@@ -311,6 +338,7 @@ class CreateIndexHandler : public DDLHandler { ...@@ -311,6 +338,7 @@ class CreateIndexHandler : public DDLHandler {
} }
}; };
static std::string static std::string
empty_if_null(const char *const p) empty_if_null(const char *const p)
{ {
...@@ -323,7 +351,6 @@ AbstractQueryExecutor *DDLHandler:: ...@@ -323,7 +351,6 @@ AbstractQueryExecutor *DDLHandler::
transformLex(Analysis &a, LEX *lex) const transformLex(Analysis &a, LEX *lex) const
{ {
std::cout<<__PRETTY_FUNCTION__<<":"<<__LINE__<<":"<<__FILE__<<":"<<__LINE__<<std::endl<<std::endl;
assert(a.deltas.size() == 0); assert(a.deltas.size() == 0);
AssignOnce<std::string> db; AssignOnce<std::string> db;
...@@ -393,7 +420,6 @@ nextImpl(const ResType &res, const NextParams &nparams) ...@@ -393,7 +420,6 @@ nextImpl(const ResType &res, const NextParams &nparams)
"deltaOutputBeforeQuery failed for DDL"); "deltaOutputBeforeQuery failed for DDL");
this->embedded_completion_id = embedded_completion_id; this->embedded_completion_id = embedded_completion_id;
} }
std::cout<<__PRETTY_FUNCTION__<<":"<<__LINE__<<":"<<__FILE__<<":"<<__LINE__<<std::endl;
std::cout<<RED_BEGIN<<"rewritten DDL: "<<this->new_query<<COLOR_END<<std::endl; std::cout<<RED_BEGIN<<"rewritten DDL: "<<this->new_query<<COLOR_END<<std::endl;
return CR_QUERY_AGAIN(this->new_query); return CR_QUERY_AGAIN(this->new_query);
} }
...@@ -402,7 +428,6 @@ nextImpl(const ResType &res, const NextParams &nparams) ...@@ -402,7 +428,6 @@ nextImpl(const ResType &res, const NextParams &nparams)
this->ddl_res = res; this->ddl_res = res;
yield { yield {
std::cout<<__PRETTY_FUNCTION__<<":"<<__LINE__<<":"<<__FILE__<<":"<<__LINE__<<std::endl<<std::endl;
return CR_QUERY_AGAIN( return CR_QUERY_AGAIN(
" INSERT INTO " + MetaData::Table::remoteQueryCompletion() + " INSERT INTO " + MetaData::Table::remoteQueryCompletion() +
" (embedded_completion_id, completion_type) VALUES" " (embedded_completion_id, completion_type) VALUES"
...@@ -421,7 +446,7 @@ nextImpl(const ResType &res, const NextParams &nparams) ...@@ -421,7 +446,7 @@ nextImpl(const ResType &res, const NextParams &nparams)
TEST_ErrPkt(deltaOutputAfterQuery(nparams.ps.getEConn(), this->deltas, TEST_ErrPkt(deltaOutputAfterQuery(nparams.ps.getEConn(), this->deltas,
this->embedded_completion_id.get()), this->embedded_completion_id.get()),
"deltaOuputAfterQuery failed for DDL"); "deltaOuputAfterQuery failed for DDL");
std::cout<<__PRETTY_FUNCTION__<<":"<<__LINE__<<":"<<__FILE__<<":"<<__LINE__<<std::endl<<std::endl; // std::cout<<__PRETTY_FUNCTION__<<":"<<__LINE__<<":"<<__FILE__<<":"<<__LINE__<<std::endl<<std::endl;
yield return CR_RESULTS(this->ddl_res.get()); yield return CR_RESULTS(this->ddl_res.get());
} }
......
...@@ -281,6 +281,7 @@ getOriginalKeyName(const Key &key) ...@@ -281,6 +281,7 @@ getOriginalKeyName(const Key &key)
return out_name; return out_name;
} }
/*
static std::vector<Key *> static std::vector<Key *>
rewrite_key(const TableMeta &tm, const Key &key, const Analysis &a) rewrite_key(const TableMeta &tm, const Key &key, const Analysis &a)
{ {
...@@ -346,6 +347,76 @@ rewrite_key(const TableMeta &tm, const Key &key, const Analysis &a) ...@@ -346,6 +347,76 @@ rewrite_key(const TableMeta &tm, const Key &key, const Analysis &a)
return output_keys; return output_keys;
} }
*/
static std::vector<Key *>
rewrite_key1(const TableMeta &tm, const Key &key, const Analysis &a)
{
std::vector<Key *> output_keys;
//从左到右分别是三种类型: oOPE, oDET, oPLAIN, 对于每个语句的index都是这样
//比如自己要alter table add 的index, 其对应index的名字, 以及相关的column信息
//比如create的时候, 产生的index, 其对应的名字以及相关的columns, 这样包含在key里面了
const std::vector<onion> key_onions = getOnionIndexTypes();
for (auto onion_it : key_onions) {
const onion o = onion_it;
THD* cthd = current_thd;
//原始key的拷贝
Key *const new_key = key.clone(cthd->mem_root);
//通过key的原始名字+onion+tm哈希获得新的key名字,用的是std::hash<string>算法.
// Set anonymous name.
const std::string new_name =
a.getAnonIndexName(tm, getOriginalKeyName(key), o);
//设置key的新名字, 以及新的key对应的column清空??
new_key->name = string_to_lex_str(new_name);
new_key->columns.empty();
//遍历原始的key的columns, 改写, 变成新key的colukns
// Set anonymous columns.
auto col_it =
RiboldMYSQL::constList_iterator<Key_part_spec>(key.columns);
for (;;) {
const Key_part_spec *const key_part = col_it++;
if (NULL == key_part) {
output_keys.push_back(new_key);
break;
}
//复制一个column信息
Key_part_spec *const new_key_part = copyWithTHD(key_part);
//原始的key_part, 也就是一个column, 里面取一个field_name出来
const std::string field_name =
convert_lex_str(new_key_part->field_name);
//通过column查tablemeta, 然后差当前的onion在不在那个tablemeta里面
// > the onion may not exist; ie oPLAIN with SENSITIVE and not
// an AUTO INCREMENT column
const FieldMeta &fm = a.getFieldMeta(tm, field_name);
const OnionMeta *const om = fm.getOnionMeta(o);
if (NULL == om) {
break;
}
//如果存在, 那么新的column的名字就是洋葱的名字, 然后new_key的column就确定了
//可以看到, 对于索引里面的每个field, 都选择一个洋葱, 如果没有合适的, 则不选择.
new_key_part->field_name =
string_to_lex_str(om->getAnonOnionName());
new_key->columns.push_back(new_key_part);
}
}
//上面, 对于一个key来说, 可以查三个洋葱
//对于每个洋葱,都可能构造一个key, 这是根据这个key对应的columns里面有没有洋葱, 有则选进来. 所以, 列扩展了以后, 索引也扩展了.
//主键特殊处理, 之根据一个洋葱构造.
// Only create one PRIMARY KEY.
if (Key::PRIMARY == key.type) {
if (output_keys.size() > 0) {
return std::vector<Key *>({output_keys.front()});
}
}
return output_keys;
}
// 'seed_lex' and 'out_lex' can be the same object. // 'seed_lex' and 'out_lex' can be the same object.
void void
...@@ -363,7 +434,7 @@ highLevelRewriteKey(const TableMeta &tm, const LEX &seed_lex, ...@@ -363,7 +434,7 @@ highLevelRewriteKey(const TableMeta &tm, const LEX &seed_lex,
// ----------------------------- // -----------------------------
// Rewrite INDEX // Rewrite INDEX
// ----------------------------- // -----------------------------
auto new_keys = rewrite_key(tm, *key, a); auto new_keys = rewrite_key1(tm, *key, a);
out_list.concat(vectorToListWithTHD(new_keys)); out_list.concat(vectorToListWithTHD(new_keys));
return out_list; return out_list;
...@@ -372,6 +443,17 @@ highLevelRewriteKey(const TableMeta &tm, const LEX &seed_lex, ...@@ -372,6 +443,17 @@ highLevelRewriteKey(const TableMeta &tm, const LEX &seed_lex,
return; return;
} }
void
highLevelRewriteForeignKey(){
}
std::string std::string
bool_to_string(bool b) bool_to_string(bool b)
{ {
...@@ -425,7 +507,6 @@ createAndRewriteField(Analysis &a, Create_field * const cf, ...@@ -425,7 +507,6 @@ createAndRewriteField(Analysis &a, Create_field * const cf,
cf->flags = cf->flags | UNSIGNED_FLAG; cf->flags = cf->flags | UNSIGNED_FLAG;
const std::string &name = std::string(cf->field_name); const std::string &name = std::string(cf->field_name);
std::cout<<RED_BEGIN<<name<<":"<<cf->sql_type<<COLOR_END<<std::endl;
std::unique_ptr<FieldMeta> std::unique_ptr<FieldMeta>
fm(new FieldMeta(*cf, a.getMasterKey().get(), fm(new FieldMeta(*cf, a.getMasterKey().get(),
a.getDefaultSecurityRating(), tm->leaseCount(), a.getDefaultSecurityRating(), tm->leaseCount(),
......
...@@ -53,6 +53,11 @@ void ...@@ -53,6 +53,11 @@ void
highLevelRewriteKey(const TableMeta &tm, const LEX &seed_lex, highLevelRewriteKey(const TableMeta &tm, const LEX &seed_lex,
LEX *const out_lex, const Analysis &a); LEX *const out_lex, const Analysis &a);
//added
void
highLevelRewriteForeignKey();
std::string std::string
bool_to_string(bool b); bool_to_string(bool b);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment