SQLite源码学习(37) 页面格式

1. 页面格式

页面由页头,cell索引数组(排序好的),未利用空闲,cell,reserve构成,具体见下面几张图
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2. cell格式

如下图所示
在这里插入图片描述
在这里插入图片描述

3.payload格式

第一个字节叫做header size,每张表都由字段类型和具体的内容组成,这个字节规定了属于字段类型的长度,每一种类型对应的格式如下图所示,注意这里是用奇偶数来区分blob类型还是string类型

在这里插入图片描述

4.样例分析

测试脚本如下

file delete -force example1.db
sqlite3 db example1.db
db eval {
    
    PRAGMA vdbe_trace = 1}
db eval {
    
    CREATE TABLE t1(a TEXT, b INTEGER)}
db eval {
    
    
  CREATE INDEX i1 ON t1(a);
   INSERT INTO t1 VALUES('one',1);
   INSERT INTO t1 VALUES('two',2);
   INSERT INTO t1 VALUES(NULL,2);
}
db eval {
    
    SELECT * FROM t1 } {
    
    
   puts "a=$a b=$b"
}
db close

数据库页面大小设置的是1024字节,insert的内容存在第2页,共3个单元,如下图所示
在这里插入图片描述
每个字节的含义见表格,header size表示类型个数,如果header size为x,则类型有x-1个

内容长度 key值 header size 类型a 类型b a b
4 3 3 0 1 / 2
7 2 3 0x13 1 two 2
6 1 3 0x13 9 one /

5.第一个cell是怎么插进去的

在insertCell函数里

 memcpy(&data[idx], pCell, sz);

6.参考资料

《SQLite Database System Design and Implementation》p162-p164
SQLite数据库文件格式逐字节详解
Database File Format

猜你喜欢

转载自blog.csdn.net/pfysw/article/details/107895103