關鍵**如下:
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...