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
+ timestamp
+ show create table
obselete functions deleted
+ annotation
......@@ -11,6 +11,10 @@
#include <util/yield.hpp>
//a list of ddl handlers, buildddlhandler, and ddlexecutor
//################################################################Create table handler#########################################################################################
class CreateTableHandler : public DDLHandler {
virtual AbstractQueryExecutor *
rewriteAndUpdate(Analysis &a, LEX *lex, const Preamble &pre) const
......@@ -75,6 +79,7 @@ class CreateTableHandler : public DDLHandler {
//对现有的每个field, 如id,name, 都在内部通过createAndRewriteField函数扩展成多个洋葱+salt.
//其中洋葱有多个层, 其通过newCreateField函数, 决定了类型, 而新的field的名字, 就是洋葱的名字传过去的.
//扩展以后, 就是新的Create_field类型了, 这了返回的list是被继续传到引用参数里面的, 很奇怪的用法.
//key data在这里的作用是, 决定是不是unique, 从而选择和是的洋葱层次.
new_lex->alter_info.create_list =
accumList<Create_field>(it,
[&a, &tm, &key_data] (List<Create_field> out_list,
......@@ -87,6 +92,7 @@ class CreateTableHandler : public DDLHandler {
// Rewrite INDEX
// -----------------------------
highLevelRewriteKey(*tm.get(), *lex, new_lex, a);
highLevelRewriteForeignKey();
// -----------------------------
// Update TABLE
......@@ -128,6 +134,10 @@ class CreateTableHandler : public DDLHandler {
}
};
//################################################################Alter table handler#########################################################################################
// mysql does not support indiscriminate add-drops
// ie,
// mysql> create table pk (x integer);
......@@ -176,6 +186,11 @@ public:
AlterTableHandler() : sub_dispatcher(buildAlterSubDispatcher()) {}
};
//################################################################drop table handler#########################################################################################
class DropTableHandler : public DDLHandler {
virtual AbstractQueryExecutor *
rewriteAndUpdate(Analysis &a, LEX *lex, const Preamble &pre) const
......@@ -219,6 +234,9 @@ class DropTableHandler : public DDLHandler {
}
};
//################################################################Create db handler#########################################################################################
class CreateDBHandler : public DDLHandler {
virtual AbstractQueryExecutor *
rewriteAndUpdate(Analysis &a, LEX *const lex, const Preamble &pre)
......@@ -248,6 +266,9 @@ class CreateDBHandler : public DDLHandler {
}
};
//################################################################change db handler#########################################################################################
class ChangeDBHandler : public DDLHandler {
virtual AbstractQueryExecutor *
rewriteAndUpdate(Analysis &a, LEX *const lex, const Preamble &pre)
......@@ -258,6 +279,8 @@ class ChangeDBHandler : public DDLHandler {
}
};
//################################################################drop db handler#########################################################################################
class DropDBHandler : public DDLHandler {
virtual AbstractQueryExecutor *
rewriteAndUpdate(Analysis &a, LEX *const lex, const Preamble &pre)
......@@ -274,6 +297,8 @@ class DropDBHandler : public DDLHandler {
}
};
//################################################################lock table handler#########################################################################################
class LockTablesHandler : public DDLHandler {
virtual AbstractQueryExecutor *
rewriteAndUpdate(Analysis &a, LEX *const lex, const Preamble &pre)
......@@ -289,6 +314,8 @@ class LockTablesHandler : public DDLHandler {
}
};
//################################################################Create index handler#########################################################################################
class CreateIndexHandler : public DDLHandler {
virtual AbstractQueryExecutor *
rewriteAndUpdate(Analysis &a, LEX *const lex, const Preamble &pre)
......@@ -311,6 +338,7 @@ class CreateIndexHandler : public DDLHandler {
}
};
static std::string
empty_if_null(const char *const p)
{
......@@ -323,7 +351,6 @@ AbstractQueryExecutor *DDLHandler::
transformLex(Analysis &a, LEX *lex) const
{
std::cout<<__PRETTY_FUNCTION__<<":"<<__LINE__<<":"<<__FILE__<<":"<<__LINE__<<std::endl<<std::endl;
assert(a.deltas.size() == 0);
AssignOnce<std::string> db;
......@@ -393,7 +420,6 @@ nextImpl(const ResType &res, const NextParams &nparams)
"deltaOutputBeforeQuery failed for DDL");
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;
return CR_QUERY_AGAIN(this->new_query);
}
......@@ -402,7 +428,6 @@ nextImpl(const ResType &res, const NextParams &nparams)
this->ddl_res = res;
yield {
std::cout<<__PRETTY_FUNCTION__<<":"<<__LINE__<<":"<<__FILE__<<":"<<__LINE__<<std::endl<<std::endl;
return CR_QUERY_AGAIN(
" INSERT INTO " + MetaData::Table::remoteQueryCompletion() +
" (embedded_completion_id, completion_type) VALUES"
......@@ -421,7 +446,7 @@ nextImpl(const ResType &res, const NextParams &nparams)
TEST_ErrPkt(deltaOutputAfterQuery(nparams.ps.getEConn(), this->deltas,
this->embedded_completion_id.get()),
"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());
}
......
......@@ -281,6 +281,7 @@ getOriginalKeyName(const Key &key)
return out_name;
}
/*
static std::vector<Key *>
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;
}
*/
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.
void
......@@ -363,7 +434,7 @@ highLevelRewriteKey(const TableMeta &tm, const LEX &seed_lex,
// -----------------------------
// Rewrite INDEX
// -----------------------------
auto new_keys = rewrite_key(tm, *key, a);
auto new_keys = rewrite_key1(tm, *key, a);
out_list.concat(vectorToListWithTHD(new_keys));
return out_list;
......@@ -372,6 +443,17 @@ highLevelRewriteKey(const TableMeta &tm, const LEX &seed_lex,
return;
}
void
highLevelRewriteForeignKey(){
}
std::string
bool_to_string(bool b)
{
......@@ -425,7 +507,6 @@ createAndRewriteField(Analysis &a, Create_field * const cf,
cf->flags = cf->flags | UNSIGNED_FLAG;
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>
fm(new FieldMeta(*cf, a.getMasterKey().get(),
a.getDefaultSecurityRating(), tm->leaseCount(),
......
......@@ -53,6 +53,11 @@ void
highLevelRewriteKey(const TableMeta &tm, const LEX &seed_lex,
LEX *const out_lex, const Analysis &a);
//added
void
highLevelRewriteForeignKey();
std::string
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