前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OceanBase 数据库大赛:支持NULL类型(草稿)

OceanBase 数据库大赛:支持NULL类型(草稿)

作者头像
程序员小王
发布2021-11-18 14:12:49
1.6K0
发布2021-11-18 14:12:49
举报
文章被收录于专栏:架构说架构说

题目

https://github.com/OceanBase-Partner/lectures-on-dbms-implementation/blob/main/miniob-topics.md

调试

代码语言:javascript
复制

少记录

breakpoint set --file condition_filter.cpp --line 388

breakpoint set --file condition_filter.cpp --line 270

breakpoint set --file bplus_tree.cpp --line 2467



查询索引
IndexScanner *Table::find_index_for_scan

IndexScanner *BplusTreeIndex::create_scanner
BplusTreeScanner::open
find_first_index_satisfied
breakpoint set --file bplus_tree.cpp --line 190
}

Table::scan_record

scan_record_by_index

next_entry

get_next_idx_in_memory
filter->filter
bool BplusTreeScanner::satisfy_condition

breakpoint set --file bplus_tree.cpp --line 2283


breakpoint set --file tuple.cpp --line 531

breakpoint set --file tuple.cpp --line 602


breakpoint set --file bplus_tree.cpp --line 2274

breakpoint set --file bplus_tree.cpp --line 2309


breakpoint set --file bplus_tree.cpp --line 190

breakpoint set --file tuple.cpp --line 531


breakpoint set --file condition_filter.cpp --line 105


breakpoint set --file execute_stage.cpp --line 811


breakpoint set --file execute_stage.cpp --line 722


case SCF_INSERT:

breakpoint set --file default_storage_stage.cpp --line 180


breakpoint set --file execute_stage.cpp  --line 340


breakpoint set --file tuple.cpp --line 586


breakpoint set --file condition_filter.cpp --line 143


breakpoint set --file condition_filter.cpp --line 105


breakpoint set --file execute_stage.cpp --line 811


breakpoint set --file execute_stage.cpp --line 722




IndexScanner *Table::find_index_for_scan(const DefaultConditionFilter &filter)


breakpoint set --file bplus_tree.cpp --line 190


breakpoint set --file table.cpp --line 1006


bool BplusTreeScanner::satisfy_condition(const char *pkey)

breakpoint set --file bplus_tree.cpp --line 2270

breakpoint set --file bplus_tree.cpp --line 1991

难点

1.5

问:多表查询,case:select t12.num,t13.num,t12.birthday from t12,t13 where t12.num=t13.num; 显示时候 select t12.num,t13.num,t12.birthday 你们思路怎么处理的,默认代码 按照表过滤字段显示的?

f7327f5bb81fada1d222df3b9e8a82e6.png

1.4gdb 对比普通索引和null 索引查找差异

提示1:如果更快 全集搜索 之前运算符是怎么解决的 case LESS_EQUAL: || case NOT_EQUAL: ||

提示2:比较运算符的差异 select * from t12 where num =14; select * from t12 where num is null;

代码语言:javascript
复制
查询索引
IndexScanner *Table::find_index_for_scan

IndexScanner *BplusTreeIndex::create_scanner
BplusTreeScanner::open
find_first_index_satisfied
breakpoint set --file bplus_tree.cpp --line 190
}

Table::scan_record

scan_record_by_index

next_entry

get_next_idx_in_memory
filter->filter
bool BplusTreeScanner::satisfy_condition

breakpoint set --file bplus_tree.cpp --line 2283

我gdb跟踪错误 :数据为什么不对。结果发现:

代码语言:javascript
复制
breakpoint set --file condition_filter.cpp --line 388

breakpoint set --file condition_filter.cpp --line 270

breakpoint set --file bplus_tree.cpp --line 2467

bool DefaultConditionFilter::filter(const Record &rec) const

1.3 有索引比较 和无索引比较

  • bool DefaultConditionFilter::filter(const Record &rec) const
  • CompareKey
  • bool BplusTreeScanner::satisfy_condition(const char *pkey)

void TupleRecordConverter::add_record(const char *record)

潜台词:这三个函数 干什么的,

1.2 null 与值 ,运算符 ,null比较

  • null 与null true
  • null 与其他值 false

1.3 null 怎么存储 自己用999代替

  • 0 == strcmp(s, "999")
  • null 在内存地址怎么存储,用null ptr 吗? 解析不到就是 null值?

思路分析

第19次测试

  • 无索引,无过滤条件,查询

bool DefaultConditionFilter::filter(const Record &rec) const

代码语言:javascript
复制
execute_stage.cpp


breakpoint set --file execute_stage.cpp --line 342


breakpoint set --file condition_filter.cpp --line 388

breakpoint set --file condition_filter.cpp --line 388

breakpoint set --file condition_filter.cpp --line 270

breakpoint set --file bplus_tree.cpp --line 2467

8c2f3f2f0768518da9706a4dcf8cac6d.png

  • select NUM from NULL_TABLE3;

breakpoint set --file bplus_tree.cpp --line 2467

  • 问题关键地方:

查询无记录 select * from NULL_TABLE3;

自己开始认为null ,不需要查询出来【错误】

  • case :在纯null情况下 avg函数出现了问题

select * from NULL_TABLE3;

breakpoint set --file execute_stage.cpp --line 342

breakpoint set --file tuple.cpp --line 355

breakpoint set --file tuple.cpp --line 834

839

SELECT NUM FROM NULL_TABLE3;

代码语言:javascript
复制
null: result file difference(`-` is yours and `+` is base)
 CREATE TABLE NULL_TABLE3(ID INT, NUM INT NULLABLE);
 SUCCESS
 INSERT INTO NULL_TABLE3 VALUES (1, NULL);
 SUCCESS
 INSERT INTO NULL_TABLE3 VALUES (2, NULL);
 SUCCESS
 SELECT COUNT(NUM) FROM NULL_TABLE3;
 COUNT(NUM)
 0
 SELECT MIN(NUM) FROM NULL_TABLE3;
+MIN(NUM)
+NULL
+SELECT max(num) FROM null_table3;
+MAX(NUM)
+NULL
+SELECT avg(num) FROM null_table3;
+AVG(NUM)
+NULL

8f306a2f07ef2203d29b6045fdb169ad.png

第18次测试

2359ac666e468f2b549276eeb91efa28.png

第17次测试:多表情况

代码语言:javascript
复制
insert into t13 values(1,20,"2021-01-30");
insert into t12 values(2,20,"2021-01-01");
select t12.num,t13.num,t12.birthday from t12,t13 where t12.num=t13.num;

breakpoint set --file execute_stage.cpp --line 308

selects

[0] = (relation_name = "t12", attribute_name = "birthday", funtype = FUN_NO) [1] = (relation_name = "t13", attribute_name = "num", funtype = FUN_NO) [2] = (relation_name = "t12", attribute_name = "num", funtype = FUN_NO)

代码语言:javascript
复制

问:多表查询,case:select t12.num,t13.num,t12.birthday from t12,t13 where t12.num=t13.num;

显示时候 select t12.num,t13.num,t12.birthday 你们思路怎么处理的,默认代码 按照表过滤字段显示的?

select t12.num,t13.num,t12.birthday from t12,t13 where t12.num=t13.num;

4f12ecdddfc3c75ec196989c93fe0313.png

breakpoint set --file execute_stage.cpp --line 307

breakpoint set --file execute_stage.cpp --line 270

breakpoint set --file execute_stage.cpp --line 340

breakpoint set --file execute_stage.cpp --line 362

1fdce6189431146436486957ee986a74.png

代码语言:javascript
复制
 schema_ = {
      fields_ = size=2 {
        [0] = {
          type_ = INTS
          table_name_ = "t12"
          field_name_ = "num"
          visible_ = true
          function_type = FUN_NO
          nullable_ = 1
          field_name_count_number_ = ""
        }
        [1] = {
          type_ = DATES
          table_name_ = "t12"
          field_name_ = "birthday"
          visible_ = true
          function_type = FUN_NO
          nullable_ = 1
          field_name_count_number_ = ""
        }
      }
      realTabeNumber = -1
    }
    
   [0] = {
    tuples_ = size=1 {
      [0] = {
        values_ = size=1 {
          [0] = std::__1::shared_ptr<TupleValue>::element_type @ 0x00007fc448604080 strong=1 weak=1 {
            __ptr_ = 0x00007fc448604080
          }
        }
        sp1 = nullptr {
          __ptr_ = nullptr
        }
        sp2 = nullptr {
          __ptr_ = nullptr
        }
        sp3 = nullptr {
          __ptr_ = nullptr
        }
        selectComareIndex = -1
      }
    }
    schema_ = {
      fields_ = size=1 {
        [0] = {
          type_ = INTS
          table_name_ = "t13"
          field_name_ = "num"
          visible_ = true
          function_type = FUN_NO
          nullable_ = 1
          field_name_count_number_ = ""
        }
      }
      realTabeNumber = -1
    }
    
  • 判断是否调整
  • 调整
代码语言:javascript
复制

select t12.num,t13.num,t12.birthday from t12,t13 where t12.num=t13.num;

create_selection_executor
null: result file difference(`-` is yours and `+` is base)
 SELECT NULL_TABLE.NUM,NULL_TABLE2.NUM,NULL_TABLE.BIRTHDAY FROM NULL_TABLE,NULL_TABLE2 WHERE NULL_TABLE.NUM=NULL_TABLE2.NUM;
-18 | 2020-01-01 | 18
-NULL_TABLE.NUM | NULL_TABLE.BIRTHDAY | NULL_TABLE2.NUM
+18 | 18 | 2020-01-01
+NULL_TABLE.NUM | NULL_TABLE2.NUM | NULL_TABLE.BIRTHDAY

16次测试:

  • 有索引情况下:非null,null与值比较 为false,一个记录无都查询不到呀?这个怎么处理 select * from t12 where num is not null; ---应该有记录的

insert into t12 values(6,null,null); //0k

select * from t12 where num =14; select * from t12 where num is null; select * from t12 where num is not null;

15 有错了

  • 修改:bool DefaultConditionFilter::filter

普通类型和int 如何比较

  • gdb 调试
代码语言:javascript
复制

breakpoint set --file execute_stage.cpp --line 270

breakpoint set --file execute_stage.cpp --line 397



代码语言:javascript
复制
select * from t12 where num is not null;

1 | 2 | 2020-01-01 缺少记录呢


  • 看日志:DefaultConditionFilter::filter IS_NOT_NULL

void TupleRecordConverter::add_record(const char *record)

索引查询:

1999行

代码语言:javascript
复制
tmp = CompareKey(node->keys + i * file_header_.key_length, key, file_header_.attr_type, file_header_.attr_length);
代码语言:javascript
复制
case LESS_THAN:
    switch (attr_type)
    {
    case INTS:
      flag = (i1 < i2);
      break;
    case FLOATS:
      flag = (f1 < f2);
      break;
    case CHARS:
      flag = (strncmp(s1, s2, attr_length) < 0);
      break;
    case DATES:
      flag = (i1 < i2);
      break;
    default:
      LOG_PANIC("Unknown attr type: %d", attr_type);
    }
    break;

有错了,在有索引和无索引条件比较不对

  • 根据测试我写代码 不对

int CompareKey(const char *pdata, const char *pkey, AttrType attr_type, int attr_length)

  • 4 对比代码
代码语言:javascript
复制
* thread #9, stop reason = breakpoint 1.1
  * frame #0: 0x0000000109e572e4 observer`CompareKey(pdata="\U00000002", pkey="999", attr_type=INTS, attr_length=4) at bplus_tree.cpp:191:3 [opt]
    frame #1: 0x0000000109e5d05a observer`BplusTreeHandler::find_first_index_satisfied(this=0x00007ff5b1407788, compop=IS_NULL, key="\xff\xff\xff\xff", page_num=<unavailable>, rididx=0x00007ff5b2b04804) at bplus_tree.cpp:1955:13 [opt]
    frame #2: 0x0000000109e5d3cf observer`BplusTreeScanner::open(this=0x00007ff5b2b044c0, comp_op=IS_NULL, value=<unavailable>) at bplus_tree.cpp:2081:23 [opt]
    frame #3: 0x0000000109e60445 observer`BplusTreeIndex::create_scanner(this=0x00007ff5b14076e0, comp_op=IS_NULL, value="999") at bplus_tree_index.cpp:98:31 [opt]
    frame #4: 0x0000000109e76550 observer`Table::find_index_for_scan(this=0x00007ff5b1605160, filter=<unavailable>) at table.cpp:1067:31 [opt]
    frame #5: 0x0000000109e75f54 observer`Table::scan_record(this=0x00007ff5b1605160, trx=0x00007ff5b1606eb0, filter=0x00007000065b1818, limit=2147483647, context=0x00007000065b17e0, record_reader=(observer`scan_record_reader_adapter(Record*, void*) at table.cpp:502))(Record*, void*)) at table.cpp:531:33 [opt]
  • 结果:
代码语言:javascript
复制
[2021-11-13 18:44:3 pid:18738 tid:7000065b5000  INFO: /Users/wangchuanyi/code/miniob/src/observer/sql/parser/parse.cpp condition_init 195]>>left_is_attr ...........
[2021-11-13 18:44:3 pid:18738 tid:7000065b5000  INFO: /Users/wangchuanyi/code/miniob/src/observer/storage/common/bplus_tree.cpp CompareKey 197]>>CompareKey int >>>: 1=2,2=3750201
[2021-11-13 18:44:3 pid:18738 tid:7000065b5000  INFO: /Users/wangchuanyi/code/miniob/src/observer/storage/common/bplus_tree.cpp CompareKey 197]>>CompareKey int >>>: 1=2,2=3750201
[2021-11-13 18:44:3 pid:18738 tid:7000065b5000  INFO: /Users/wangchuanyi/code/miniob/src/observer/storage/common/bplus_tree.cpp CompareKey 197]>>CompareKey int >>>: 1=2,2=3750201
[2021-11-13 18:44:3 pid:18738 tid:7000065b5000  INFO: /Users/wangchuanyi/code/miniob/src/observer/storage/common/bplus_tree.cpp CompareKey 197]>>CompareKey int >>>: 1=3750201,2=3750201
[2021-11-13 18:44:3 pid:18738 tid:7000065b5000  INFO: /Users/wangchuanyi/code/miniob/src/observer/storage/common/bplus_tree.cpp CompareKey 197]>>CompareKey int >>>: 1=3750201,2=3750201
[2021-11-13 18:44:3 pid:18738 tid:7000065b5000  INFO: /Users/wangchuanyi/code/miniob/src/observer/storage/common/bplus_tree.cpp CompareKey 197]>>CompareKey int >>>: 1=3750201,2=3750201
[2021-11-13 18:44:3 pid:18738 tid:7000065b5000  INFO: /Users/wangchuanyi/code/miniob/src/observer/storage/common/bplus_tree.cpp CompareKey 197]>>CompareKey int >>>: 1=3750201,2=3750201
[2021-11-13 18:44:3 pid:18738 tid:7000065b5000  INFO: /Users/wangchuanyi/code/miniob/src/observer/sql/executor/execute_stage.cpp do_select 681]>> query resault. id | num | birthday
  • 原因呢?
  • 插入的时候null 是按照999存储的。但是查找过程中。自己没有修改解析,null是按照 null过滤的
代码语言:javascript
复制
//比较2个key 大小
int CompareKey(const char *pdata, const char *pkey, AttrType attr_type, int attr_length)

bool DefaultConditionFilter::filter(const Record &rec) const

不对呀 比较从哪里跌

根据索引查找:

RC Table::scan_record(

null 用 999 表示

代码语言:javascript
复制
 IndexScanner *index_scanner = find_index_for_scan(filter);
  if (index_scanner != nullptr)
  {
    return scan_record_by_index(trx, index_scanner, filter, limit, context, record_reader);
  }

1faecc37091dddb49caa28920dbbaaf6.png

2.11 - null 与null 比较规规则和上买的相反

  • 修改过滤条件:

bool DefaultConditionFilter::filter(const Record &rec) const

2.10 有错误了

题目:支持NULL类型

sql:select * from t where null is null; -- 注意 = 与 is 的区别

问题:null is null 这个是true 还是false呀?

测试结果不对

d4eb03443d80d58b67138d2bab9c486f.png

  • 错误代码位置:null 不是列 直接报错
  • 为什么 NULLL 变了???

e9f6fd4ac322baa76fb9d1189723bc41.png

right_is_attr = 1 right_attr = (relation_name = 0x0000000000000000, attribute_name = "NULLL", funtype = FUN_MAX | 0xe2f300a8)

24d1a4919d6dbd8c241f423396d1bf3d.png

  • 错误sql:

select * from t12 WHERE NULL IS NULLL;

代码语言:javascript
复制
right.is_attr = true;
    const FieldMeta *field_right = table_meta.field(condition.right_attr.attribute_name);
    if (nullptr == field_right)
    {
      LOG_WARN("No such field in condition. %s.%s", table.name(), condition.right_attr.attribute_name);
      return RC::SCHEMA_FIELD_MISSING;
    }
    
    
  void condition_init(Condition *condition, CompOp comp, 
                    int left_is_attr, RelAttr *left_attr, Value *left_value,
                    int right_is_attr, RelAttr *right_attr, Value *right_value) {
                    
  • |value comOp value

2.9 比较运算符与null比较 都是false

Comparison Functions and Operators

https://dev.mysql.com/doc/refman/8.0/en/working-with-null.html

  • 12.4.2 Comparison Functions and Operators

https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html#operator_equal

https://dev.mysql.com/doc/refman/8.0/en/working-with-null.html

mysql> SELECT 1 = NULL, 1 <> NULL, 1 < NULL, 1 > NULL;

You cannot use arithmetic comparison operators such as =, <, or <> to test for NULL. To demonstrate this for yourself, try the following query:

Because the result of any arithmetic comparison with NULL is also NULL, you cannot obtain any meaningful results from such comparisons. https://dev.mysql.com/doc/refman/8.0/en/working-with-null.html

画外音:

  • 任何 值与NULL做对比,结果都是FALSE。
  • 任何 比较运算 NULL做对比,结果都是FALSE。

代码:

  • bool DefaultConditionFilter::filter(const Record &rec) const

select * from t12 where 1<>NULL; select * from t12 where NULL<>1;

  • filter->filter(record)))

RC Table::scan_record_by_index(

代码语言:javascript
复制
class ConditionFilter {
public:
  virtual ~ConditionFilter();

  /**
   * Filter one record
   * @param rec
   * @return true means match condition, false means failed to match.
   */
  virtual bool filter(const Record &rec) const = 0;
};
  • [ ] 完整查看select 过滤条件

do_select->create_selection_executor->

class DefaultConditionFilter : public ConditionFilter

execute

代码语言:javascript
复制
//sql执行
RC SelectExeNode::execute(TupleSet &tuple_set) {
  CompositeConditionFilter condition_filter;
  condition_filter.init((const ConditionFilter **)condition_filters_.data(), condition_filters_.size());

  tuple_set.clear();
  tuple_set.set_schema(tuple_schema_);
  tuple_set.old_schema =old_tuple_schema;
  TupleRecordConverter converter(table_, tuple_set);
  return table_->scan_record(trx_, &condition_filter, -1, (void *)&converter, record_reader);
}
  • RC Table::scan_record(Trx *trx, ConditionFilter *filter, int limit, void *context, RC (*record_reader)(Record *record, void *context))
  • IndexScanner *index_scanner = find_index_for_scan(filter);
  • rc = scanner.open_scan(*data_buffer_pool_, file_id_, filter);
  • condition_filter_->filter(current_record))
  • bool DefaultConditionFilter::filter(const Record &rec) const

总结:

任何 值(保留运算符)与NULL做对比,结果都是FALSE

https://dev.mysql.com/doc/refman/8.0/en/working-with-null.html

2.8 修改索引过滤条件

  • bool BplusTreeScanner::satisfy_condition(const char *pkey)

AttrType attr_type = index_handler_.file_header_.attr_type;

代码语言:javascript
复制
 case IS_NULL:
    {
      flag =false;
    }
    break;

    case IS_NOT_NULL:
    {
      flag =true;
    }
    break;

2.7 为什么执行无结果

select * from t12 where id is null; select * from t12 where id is not null;

select * from t12 where 1<>NULL; select * from t12 where 1 IS NOT NULL;

任务:RC DefaultConditionFilter::init(Table &table, const Condition &condition)

  • [ ] 任务:

bool DefaultConditionFilter::filter(const Record &rec) const

1 IS NOT NULL; //true case IS_NOT_NULL: return cmp_result != 0;

2.6 执行错误

select * from t12 where id is null;

std::vector<DefaultConditionFilter *> condition_filters;

代码语言:javascript
复制
RC DefaultConditionFilter::init(Table &table, const Condition &condition)

private:
  ConDesc  left_;
  ConDesc  right_;
  AttrType attr_type_ = UNDEFINED;
  CompOp   comp_op_ = NO_OP;
};

任务:调整RC DefaultConditionFilter::init函数

2.5 增加 查询时候 null 判断

代码语言:javascript
复制
where:
condition:

2.4 create: 增加 NOT NULL 关键字

2.3 修改聚合函数

bool TupleSet::avg_print(std::ostream &os) const

  • TupleField 包含聚合函数
  • std::vector<std::shared_ptr> values_;

2.2 显示 Tuple tuple;

  • null 显示和普通类型的显示一样吗?
  • 这里考虑单行的情况
  • //单表聚合:只有一行
  • 看懂类:class Tuple

代码实现

2.3 where条件

  • 产生过滤条件:std::vector<DefaultConditionFilter *> condition_filters;
代码语言:javascript
复制
RC DefaultConditionFilter::init(Table &table, const Condition &condition)

private:
  ConDesc  left_;
  ConDesc  right_;
  AttrType attr_type_ = UNDEFINED;
  CompOp   comp_op_ = NO_OP;
};
  • 执行过滤条件
  • bool DefaultConditionFilter::filter(const Record &rec) const

bool BplusTreeScanner::satisfy_condition(const char *pkey)

  • 用 999代码
代码语言:javascript
复制
comOp:
     EQ { CONTEXT->comp = EQUAL_TO; }
    | LT { CONTEXT->comp = LESS_THAN; }
    | GT { CONTEXT->comp = GREAT_THAN; }
    | LE { CONTEXT->comp = LESS_EQUAL; }
    | GE { CONTEXT->comp = GREAT_EQUAL; }
    | NE { CONTEXT->comp = NOT_EQUAL; }
    ;

2.2 显示 Tuple tuple;

void TupleRecordConverter::add_record(const char *record)

测试结果

case 3

代码语言:javascript
复制
null: result file difference(`-` is yours and `+` is base)
 3. SELECT WITH CONSTANT
 SELECT * FROM NULL_TABLE WHERE 1 IS NULL;
-FAILURE
+ID | NUM | PRICE | BIRTHDAY
 SELECT * FROM NULL_TABLE WHERE 1 IS NOT NULL;
-FAILURE
+1 | 18 | 10 | 2020-01-01
+2 | NULL | 20 | 2010-01-11
+3 | 12 | 30 | NULL
+4 | 15 | 30 | 2021-01-31
+ID | NUM | PRICE | BIRTHDAY
 SELECT * FROM NULL_TABLE WHERE NULL=1;
-FAILURE
+ID | NUM | PRICE | BIRTHDAY
 SELECT * FROM NULL_TABLE WHERE 1=NULL;
-FAILURE
+ID | NUM | PRICE | BIRTHDAY
 SELECT * FROM NULL_TABLE WHERE 1<>NULL;
-FAILURE
+ID | NUM | PRICE | BIRTHDAY
 SELECT * FROM NULL_TABLE WHERE 1<NULL;
-FAILURE
+ID | NUM | PRICE | BIRTHDAY
 SELECT * FROM NULL_TABLE WHERE 1>NULL;
-FAILURE
+ID | NUM | PRICE | BIRTHDAY

CREATE TABLE NULL_TABLE(ID INT, NUM INT NULLABLE, PRICE FLOAT NOT NULL, BIRTHDAY DATE NULLABLE);

CREATE TABLE NULL_TABLE2(ID INT, NUM INT NULLABLE, PRICE FLOAT NOT NULL, BIRTHDAY DATE NULLABLE);

CREATE INDEX INDEX_NUM ON NULL_TABLE(NUM);

代码语言:javascript
复制

 CREATE TABLE NULL_TABLE(ID INT, NUM INT NULLABLE, PRICE FLOAT NOT NULL, BIRTHDAY DATE NULLABLE);
-FAILURE
+SUCCESS
 CREATE TABLE NULL_TABLE2(ID INT, NUM INT NULLABLE, PRICE FLOAT NOT NULL, BIRTHDAY DATE NULLABLE);
-FAILURE
+SUCCESS
 CREATE INDEX INDEX_NUM ON NULL_TABLE(NUM);
-FAILURE
+SUCCESS



3298bb857adc370ead1071015fc2060b.png

  1. core ok

: line 1: 1355 Segmentation fault: 11 ./observer -f ./observer.ini

0x0000000107d8ef8d Table::make_record(int, _Value const*, char*&) + 1357 (table.cpp:430)

  1. 不对 ok

f93af99ea8021b6cb8df592825469889.png

代码语言:javascript
复制
null: result file difference(`-` is yours and `+` is base)
 3. SELECT WITH CONSTANT
 SELECT * FROM NULL_TABLE WHERE 1 IS NULL;
 ID | NUM | PRICE | BIRTHDAY
 SELECT * FROM NULL_TABLE WHERE 1 IS NOT NULL;
 1 | 18 | 10 | 2020-01-01
 2 | NULL | 20 | 2010-01-11
 3 | 12 | 30 | NULL
 4 | 15 | 30 | 2021-01-31
 ID | NUM | PRICE | BIRTHDAY
 SELECT * FROM NULL_TABLE WHERE NULL=1;
-FAILURE
+ID | NUM | PRICE | BIRTHDAY
 SELECT * FROM NULL_TABLE WHERE 1=NULL;
 ID | NUM | PRICE | BIRTHDAY
 SELECT * FROM NULL_TABLE WHERE 1<>NULL;
-1 | 18 | 10 | 2020-01-01
-2 | NULL | 20 | 2010-01-11
-3 | 12 | 30 | NULL
-4 | 15 | 30 | 2021-01-31
 ID | NUM | PRICE | BIRTHDAY
 SELECT * FROM NULL_TABLE WHERE 1<NULL;
-1 | 18 | 10 | 2020-01-01
-2 | NULL | 20 | 2010-01-11
-3 | 12 | 30 | NULL
-4 | 15 | 30 | 2021-01-31
 ID | NUM | PRICE | BIRTHDAY
 SELECT * FROM NULL_TABLE WHERE 1>NULL;
 ID | NUM | PRICE | BIRTHDAY
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-11-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Offer多多 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 调试
  • 难点
  • 1.5
  • 1.4gdb 对比普通索引和null 索引查找差异
  • 1.3 有索引比较 和无索引比较
  • 1.2 null 与值 ,运算符 ,null比较
    • 1.3 null 怎么存储 自己用999代替
      • 思路分析
        • 第19次测试
          • 第18次测试
            • 第17次测试:多表情况
              • 16次测试:
                • 15 有错了
                  • 有错了,在有索引和无索引条件比较不对
                    • 2.11 - null 与null 比较规规则和上买的相反
                      • 2.10 有错误了
                        • 2.9 比较运算符与null比较 都是false
                          • 2.8 修改索引过滤条件
                            • 2.7 为什么执行无结果
                              • 2.6 执行错误
                                • 2.5 增加 查询时候 null 判断
                                  • 2.4 create: 增加 NOT NULL 关键字
                                    • 2.3 修改聚合函数
                                      • 2.2 显示 Tuple tuple;
                                        • 代码实现
                                          • 2.3 where条件
                                            • 2.2 显示 Tuple tuple;
                                            • 测试结果
                                              • case 3
                                              领券
                                              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档