SQLite原始碼學習 36 Btree雜記

2021-10-08 18:28:30 字數 3697 閱讀 2018

關鍵**如下:

if( pbt->npage>0 )
只有在資料庫為空的時候才寫入,不為空的時候直接返回了,不會往下執行。

30 tablelock 0 1 1 sqlite_master 00 idb=0 root=1 write=1

首先定義字元陣列

/* 161 */ "tablelock"        ophelp("idb=p1 root=p2 write=p3"),

# define ophelp(x) "\0" x

sqlite3opcodename(pop->opcode)獲取tablelock字串,displaycomment解析注釋,並把注釋中的p1,p2,p3用真實值替換掉

file delete -force example1.db

sqlite3 db example1.db

db eval

db eval

執行結果如下

open 537402416 e:\qxqb\open_source\sqlite-src-3310100\test\example1.db

sql: [pragma vdbe_trace = 1]

vdbe trace:

0 init 0 1 0 00 start at 1

1 expire 0 0 0 00

2 halt 0 0 0 00

......

//此處未列印sql語句----(1)

vdbe trace:

0 init 0 13 0 00 start at 13

13 transaction 0 0 0 0 00 usesstmtjournal=0

14 tablelock 0 1 0 sqlite_master 00 idb=0 root=1 write=0

15 goto 0 1 0 00

......

sql: [create table t1(a text, b integer)]

vdbe trace:

0 init 0 29 0 00 start at 29

29 transaction 0 1 0 0 01 usesstmtjournal=0

30 tablelock 0 1 1 sqlite_master 00 idb=0 root=1 write=1

31 goto 0 1 0 00

1 readcookie 0 3 2 00

......

27 parseschema 0 0 0 tbl_name='t1' and type!='trigger' 00

//此處未列印sql語句----(1)

vdbe trace:

0 init 0 19 0 00 start at 19

19 transaction 0 0 1 0 00 usesstmtjournal=0

20 tablelock 0 1 0 sqlite_master 00 idb=0 root=1 write=0

21 string8 0 2 0 t1 00 r[2]='t1'

每執行一句sql**對應一段vdbe 位元組碼程式,為什麼有2處沒有sql語句?這是內部執行的sql語句,並不是外部輸入,第(1)處是

select*from\"main\".sqlite_master order by rowid

第(2)處是

select*from\"main\".sqlite_master where tbl_name='t1' and type!='trigger' order by rowid

sql語句的解釋執行sqlite3_exec包括sqlite3_prepare_v2和sqlite3_step兩部分,第(1)處的執行流程如下

第(2)處執行流程如下

如上三張圖所示,只有db->init.busy為0時才列印,但是create table語句已經把db->init.busy置1了,所有內部sql語句不會列印。

其實就在newdatabase的zeropage裡,前100個位元組初始化完成後,緊接著新建一張sqlite_master表用來存放所有的表

data[hdr]=(

char

)flags;

first = hdr +

((flags&ptf_leaf)==0

?12:8

);memset

(&data[hdr+1]

,0,4

);data[hdr+7]

=0;put2byte

(&data[hdr+5]

, pbt->usablesize)

;

test_quota.c test_fs.c:

#define sqlite_os_win 0

#define sqlite_os_unix 1

函式沒定義的,注釋掉相關編譯選項或直接在**裡遮蔽掉 zipfile.c有錯,編譯加-lz

sqlite_enable_deserialize全都注釋掉,無論**還是makefile

大概修改方法如上,可能不同機器上有些差異,但思路都差不多,另外如果出現下面這樣的錯誤

'_p_wait' undeclared (first use in this function)

; did you mean '__valist'?

rval = _spawnv (_p_wait, lt_ar**_zero, (const char * const *) newargz)

;

把bld資料夾下libtool檔案中的build_libtool_libs=yes改為build_libtool_libs=n

SQLITE原始碼剖析 11

應用程式必須在關閉sqlite3物件前,sqlite3 finalize finalize 所有的與該物件相關的 prepared statements 必須 sqlite3 blob close close 所有的與該物件相關的 blob handles blob大二進位制控制代碼 and sql...

Sqlite3原始碼部署

大二,大三花了不少時間來學習sqlite3的原始碼,之前一直是通過文件記錄 沒有寫成部落格。現在打算通過部落格交流自己的成果,但需要強調的是,部落格中可能會有個人理解偏差而出現出錯誤。二 sqlite3配置使用 然後將sqlite tools檔案中的sqlite3.exe檔案配置到環境變數中,然後就...

Linux筆記(36) 原始碼包安裝

如何啟動使用原始碼包安裝的軟體 rpm包安裝的的服務可以使用系統服務管理命令 service 來管理,例如 rpm包安裝位置自動指定,原始碼包需要自己指定位置,一般是 usr local 軟體名 原始碼包安裝的軟體,直接刪除目錄即可解除安裝 安裝原始碼包之前,保證系統上已經安裝gcc,可以使用yum...