下面是记录过程 大家可以不看。
https://jgithub.com/hnwyllmm/miniob_test/issues/1
https://github.com/oceanbase/miniob.git
https://github.com/OceanBase-Partner/lectures-on-dbms-implementation/blob/main/miniob-introduction.md
https://open.oceanbase.com/competition/index
-https://github.com/oceanbase/miniob.git
题目:一次插入多条数据
问题:插入一个记录 怎么提交了2次。感觉这么复杂 1 第一次:已经插入完成 record_handler_->insert_record() 插入到DiskBufferPool中去了。
问:你们yyac表示怎么修改的?我啥我这样写 ,多个()的value,为啥认为是一个()value呢?
这样递归定义哪里有问题?
271e18ae03ee62481ac41a92d334abcb.png377f7a94ed942ad75a210fda92747bf1.png
上来追加方式,而不是直接修改,导致错误 耽误2天时间。
难点:降低为之支持2个values ,然后看测试结果
/Users/wangchuanyi/code/miniob_tag/miniob/src/observer/sql/parser/parse_defs.h
用二维矩阵存储内容,每个values 内容,row+1 虽然+1,但是解析时候不起作用?最后都解析第一行了。
char *record_data; RC rc = make_record(value_num, values, record_data);
case Operation::Type::INSERT:
RC Table::commit_insert(Trx *trx, const RID &rid)
#### select_attr --> attr_list
select_attr:
| ID attr_list {
RelAttr attr;
relation_attr_init(&attr, NULL, $1);
selects_append_attribute(&CONTEXT->ssql->sstr.selection, &attr);
}
attr_list:
/* empty */
| COMMA ID attr_list {
RelAttr attr;
relation_attr_init(&attr, NULL, $2);
selects_append_attribute(&CONTEXT->ssql->sstr.selection, &attr);
// CONTEXT->ssql->sstr.selection.attributes[CONTEXT->select_length].relation_name = NULL;
// CONTEXT->ssql->sstr.selection.attributes[CONTEXT->select_length++].attribute_name=$2;
}
INSERT INTO ID VALUES LBRACE value value_list RBRACE SEMICOLON
typedef struct ParserContext {
Query * ssql;
size_t select_length;
size_t condition_length;
size_t from_length;
size_t value_length;
Value values[MAX_NUM];
Condition conditions[MAX_NUM];
CompOp comp;
char id[MAX_NUM];
} ParserContext;
insert_stmt
case SCF_INSERT:
const Inserts &inserts = sql->sstr.insertion;
// struct of insert
typedef struct {
char *relation_name; // Relation to insert into
size_t value_num; // Length of values
Value values[MAX_NUM]; // values to insert
} Inserts;
//不太敢修改Inserts改为集合结构
//我新增一个同样的结构
typedef struct {
char *relation_name; // Relation to insert into
size_t value_num; // Length of values
Value values[MAX_NUM]; // values to insert
} InsertLeft;
// struct of craete_table
typedef struct {
char *relation_name; // Relation name
size_t attribute_count; // Length of attribute
AttrInfo attributes[MAX_NUM]; // attributes
} CreateTable;
create_table_append_attribute
void create_table_append_attribute(CreateTable *create_table, AttrInfo *attr_info)
{
create_table->attributes[create_table->attribute_count++] = *attr_info;
}
create_table_append_attribute(&CONTEXT->ssql->sstr.create_table, &attribute);
union Queries {
Selects selection;
Inserts insertion;
Deletes deletion;
Updates update;
CreateTable create_table;
DropTable drop_table;
CreateIndex create_index;
DropIndex drop_index;
DescTable desc_table;
LoadData load_data;
char *errors;
};
| MIN LBRACE ID RBRACE attr_list {
RelAttr attr;
attr.funtype=FUN_MIN;
relation_attr_init(&attr, NULL,$3);
selects_append_attribute(&CONTEXT->ssql->sstr.selection, &attr);
}
void selects_append_attribute(Selects *selects, RelAttr *rel_attr)
{
selects->attributes[selects->attr_num++] = *rel_attr;
}
#!/bin/bash
sqls='
drop table t;
drop index unique_index_01 on t;
create table t(id int, age int,name char,birthday date,money float);
create unique index unique_index_01 on t(id);
## 测试
insert into t values(1,11, "a","2021-3-1",1.2),(2,22, "c","2021-3-2",2.2);
insert into t values(3,33, "c","2021-3-3",3.2);
'
>test.tmp
echo -n "$sqls" | while read line
do
echo "$line"
echo -n "$line" | ../obclient | sed -e "s/miniob > //"
echo "------------------------------"
done >>test.tmp
flex lex_sql.l
bison -d -b yacc_sql yacc_sql.y
breakpoint set --file default_storage_stage.cpp --line 180
breakpoint set --file parse.cpp --line 259
insert: result file difference(`-` is yours and `+` is base)
2. ERROR
INSERT INTO INSERT_TABLE VALUES (4,'N4',1,1),(1,1,1);
-SUCCESS
+FAILURE
INSERT INTO INSERT_TABLE VALUES (4,'N4',1,1),(1,1,1,1);
-SUCCESS
+FAILURE