非常教程

Sqlite参考手册

其他 | Miscellaneous

Architecture of SQLite

介绍

本文档描述了SQLite库的体系结构。这里的信息对那些想要理解或修改SQLite内部工作的人很有用。

附近的图表显示了SQLite的主要组件以及它们如何互操作。以下文本解释了各个组件的作用。

概观

SQLite的工作原理是将SQL文本编译为字节码,然后使用虚拟机运行该字节码。

sqlite3_prepare_v2()和相关接口充当用于将SQL文本转换为字节码的编译器。sqlite3_stmt对象是用于实现单个SQL语句的单个字节码程序的容器。sqlite3_step()接口将一个字节码程序传递给虚拟机,并运行该程序直到它完成,或者形成一行结果返回,或者发生致命错误或中断。

接口

许多C语言接口可以在源文件main.clegacy.cvdbeapi.c中找到,尽管一些例程分散在其他文件中,在这些文件中它们可以访问具有文件范围的数据结构。sqlite3_get_table()例程在table.c中实现。sqlite3_mprintf()例程在printf.c中找到。sqlite3_complete()接口位于tokenize.c中。TCL接口由tclsqlite.c实现。

为避免名称冲突,SQLite库中的所有外部符号都以前缀sqlite3开头。那些用于外部使用的符号(换句话说,那些构成SQLite API的符号)会添加一个下划线,因此以sqlite3_开头。扩展API有时会在下划线之前添加扩展名; 例如:sqlite3rbu_sqlite3session_

标记生成器

当包含SQL语句的字符串要被评估时,它首先被发送到标记器。标记器将SQL文本分解为标记并将这些标记逐个传递给解析器。标记器是在文件tokenize.c中手动编码的。

请注意,在此设计中,标记器调用解析器。熟悉YACC和BISON的人可能习惯于以相反的方式做事 - 让解析器调用标记器。不过,令牌分析器调用分析器会更好,因为它可以做成线程安全的并且运行速度更快。

分析器

解析器根据其上下文为令牌分配含义。SQLite的解析器是使用Lemon LALR(1)解析器生成器生成的。柠檬和YACC / BISON一样工作,但它使用了不太容易出错的输入语法。柠檬还生成一个可重入且线程安全的解析器。柠檬定义了非终端析构函数的概念,以便在遇到语法错误时不会泄漏内存。驱动Lemon并定义SQLite可理解的SQL语言的语法文件可在parse.y中找到。

因为Lemon是一个通常在开发机器上找不到的程序,Lemon的完整源代码(只有一个C文件)包含在SQLite分发的“tool”子目录中。

代码生成器

解析器将令牌组装成解析树之后,代码生成器运行以分析解析器树并生成执行SQL语句工作的字节码。准备好的语句对象是这个字节码的容器。有许多文件中的代码生成器,包括:attach.cauth.cbuild.cdelete.cexpr.cinsert.cpragma.cselect.ctrigger.cupdate.cvacuum.cwhere.cwherecode.cwhereexpr.c。在这些文件中,大部分严重的魔法都是在这里发生的。expr.c处理表达式的代码生成。其中* .c处理SELECT,UPDATE和DELETE语句中WHERE子句的代码生成。该文件attach.cdelete.cinsert.cselect.ctrigger.c update.cvacuum.c处理代码生成具有相同名称的SQL语句。(这些文件中的每一个都根据需要调用expr.cwhere.c中的例程。)所有其他SQL语句都由build.c编码。该auth.c 文件实现了sqlite3_set_authorizer()的功能。

代码生成器,特别是* .cselect.c中的逻辑有时称为查询规划器。对于任何特定的SQL语句,可能有数百,数千或数百万种不同的算法来计算答案。查询计划员是一个AI,致力于从数百万个选择中选择最佳算法。

字节码引擎

由代码生成器创建的字节码程序由虚拟机运行。

虚拟机本身完全包含在单个源文件vdbe.c中。所述vdbe.h头文件定义了虚拟机和SQLite库的其余部分之间的界面vdbeInt.h其定义了私人虚拟机本身的结构和接口。其他各种vdbe * .c文件都是虚拟机的助手。所述vdbeaux.c文件包含由所用的库的其余部分来构造VM程序在虚拟机和接口模块中使用的工具。该vdbeapi.c文件包含虚拟机的外部接口,如sqlite3_bind_int()和sqlite3_step()。各个值(字符串,整数,浮点数和BLOB)存储在由vdbemem.c实现的名为“Mem”的内部对象中。

SQLite使用C语言例程的回调来实现SQL函数。即使内置的SQL函数也是这样实现的。大多数内置的SQL函数(例如:abs(),count(),substr()等)都可以在func.c源文件中找到。日期和时间转换函数可在date.c中找到。一些函数如coalesce()和typeof()直接由代码生成器实现为字节码。

B树

SQLite数据库使用btree.c源文件中的B-tree实现在磁盘上进行维护。数据库中的每个表和索引都使用单独的B树。所有B树都存储在同一个磁盘文件中。文件格式细节稳定且定义明确,并保证向前兼容。

B树子系统和SQLite库的其余部分的接口由头文件btree.h定义。

页面缓存

B树模块以固定大小的页面从磁盘请求信息。默认的page_size是4096字节,但可以是512到65536字节之间的任意两个幂。页面缓存负责读取,写入和缓存这些页面。页面缓存还提供了回滚和原子提交抽象,并负责锁定数据库文件。B树驱动程序请求页面缓存中的特定页面,并在需要修改页面或提交或回滚更改时通知页面缓存。页面缓存处理了确保请求被快速,安全和有效地处理的所有细节。

主页面缓存实现在pager.c文件中。WAL模式逻辑位于单独的wal.c中。内存中缓存由pcache.cpcache1.c文件实现。页面缓存子系统和SQLite其余部分之间的接口由头文件pager.h定义。

OS界面

为了提供跨操作系统的可移植性,SQLite使用称为VFS的抽象对象。每个VFS都提供了打开,读取,写入和关闭磁盘上的文件以及执行其他特定于操作系统的任务(如查找当前时间或获取随机性以初始化内置伪随机数生成器的方法)。SQLite当前为unix(在os_unix.c文件中)和Windows(在os_win.c文件中)提供了VFSes

公用事业

内存分配,无格式字符串比较例程,可移植的文本到数字转换例程以及其他实用程序位于util.c中。解析器使用的符号表由hash.c中的哈希表维护。该utf.c源文件包含Unicode转换子程序。SQLite的有()自己的私人执行的printf(有一些扩展)在printf.c并在其自己的伪随机数生成器(PRNG)random.c

测试代码

源代码树的“src /”文件夹中名称以test开头的文件仅用于测试,不包含在库的标准版本中。

 SQLite在公共领域。

其他 | Miscellaneous相关

1.35% Faster Than The Filesystem
2.8+3 Filenames
3.An Asynchronous I/O Module For SQLite
4.Appropriate Uses For SQLite
5.Atomic Commit In SQLite
6.Automatic Undo/Redo With SQLite
7.Benefits of SQLite As A File Format
8.Change in Default Page Size in SQLite Version 3.12.0
9.Clustered Indexes and the WITHOUT ROWID Optimization
10.Compile-time Options
11.Constraint Conflict Resolution in SQLite
12.Custom Builds Of SQLite
13.Deterministic SQL Functions
14.Distinctive Features Of SQLite
15.EXPLAIN QUERY PLAN
16.Features Of SQLite
17.File Format Changes in SQLite
18.Full-Featured SQL
19.High Reliability
20.Hints for Debugging SQLite
21.How SQLite Is Tested
22.How To Compile SQLite
23.How To Download Canonical SQLite Source Code
24.Imposter Tables
25.In-Memory Databases
26.Indexes On Expressions
27.Internal Versus External BLOBs
28.Isolation In SQLite
29.Long Term Support
30.Maintaining Private Branches Of SQLite
31.Many Small Queries Are Efficient In SQLite
32.Measuring and Reducing CPU Usage in SQLite
33.Memory-Mapped I/O
34.NULL Handling in SQLite
35.Partial Indexes
36.Pointer Passing Interfaces
37.Powersafe Overwrite
38.Release History Of SQLite
39.Result and Error Codes
40.Row Values
41.Rowid Tables
42.Run-Time Loadable Extensions
43.SQL Features That SQLite Does Not Implement
44.sqldiff.exe: Database Difference Utility
45.SQLite As An Application File Format
46.SQLite Autoincrement
47.SQLite Backup API
48.SQLite Changes From Version 3.4.2 To 3.5.0
49.SQLite Changes From Version 3.5.9 To 3.6.0
50.SQLite Database Speed Comparison
51.SQLite File IO Specification
52.SQLite Frequently Asked Questions
53.SQLite In 5 Minutes Or Less
54.SQLite is a Self Contained System
55.SQLite Is Serverless
56.SQLite Is Transactional
57.SQLite Library Footprint
58.SQLite Shared-Cache Mode
59.SQLite Unlock-Notify API
60.SQLite Version 3 Overview
61.SQLite: Single File Database
62.Temporary Files Used By SQLite
63.TH3
64.The COMPLETION() Table-Valued Function
65.The CSV Virtual Table
66.The dbhash.exe Utility Program
67.The DBSTAT Virtual Table
68.The Error And Warning Log
69.The generate_series Table-Valued Function
70.The OS Backend (VFS) To SQLite
71.The Spellfix1 Virtual Table
72.The SQLite Amalgamation
73.The SQLite Bytecode Engine
74.The sqlite3_analyzer.exe Utility Program
75.The SQLITE_STMT Virtual Table
76.The UNION Virtual Table
77.The Virtual Database Engine of SQLite
78.Uniform Resource Identifiers
79.Using SQLite In Multi-Threaded Applications
80.Version Numbers in SQLite
81.What If OpenDocument Used SQLite?
82.Why Is SQLite Coded In C
83.Zero-Configuration
Sqlite

SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来

主页 https://sqlite.org/
源码 https://www.sqlite.org/src/
发布版本 3.21.0

Sqlite目录

1.C界面 | C Interface
2.C Interface: Session Module
3.CLI
4.数据库文件表 | Database File Format
5.数据类 | Datatypes
6.动态内存分配 | Dynamic Memory Allocation
7.外键约束 | Foreign Key Constraints
8.全文索引 | Full-Text Search
9.损坏方式 | How To Corrupt
10.JSON
11.语言 | Language
12.局限性 | Limits
13.锁定和并发 | Locking and Concurrency
14.其他 | Miscellaneous
15.PRAGMA Statements
16.查询计划程序 | Query Planner
17.R*Tree Module
18.RBU Extension
19.语法图 | Syntax Diagrams
20.Tcl Interface
21.虚拟表机制 | Virtual Table Mechanism
22.预写日志 | Write-Ahead Logging
23.SQL 教程
24.SQL 简介
25.SQL 语法
26.SQL DELETE 语句
27.SQL UPDATE 语句
28.SQL NOT NULL 约束
29.SQL 约束
30.SQL CREATE TABLE 语句
31.SQL CREATE DATABASE 语句
32.SQL INSERT INTO SELECT 语句
33.SQL SELECT INTO 语句
34.SQL CREATE VIEW、REPLACE VIEW、 DROP VIEW 语句
35.SQL AUTO INCREMENT 字段
36.SQL ALTER TABLE 语句
37.SQL 撤销索引、表以及数据库
38.SQL CREATE INDEX 语句
39.SQL DEFAULT 约束
40.SQL CHECK 约束
41.SQL FOREIGN KEY 约束
42.SQL PRIMARY KEY 约束
43.SQL UNIQUE 约束
44.SQL 通用数据类型
45.SQL ISNULL()、NVL()、IFNULL() 和 COALESCE() 函数
46.SQL NULL 值 – IS NULL 和 IS NOT NULL
47.SQL Server 和 MySQL 中的 Date 函数
48.SQL MS Access、MySQL 和 SQL Server 数据类型
49.SQL 函数
50.SQL 总结
51.SQL 主机
52.SQL 快速参考
53.SQL ROUND() 函数
54.SQL Server GETDATE() 函数
55.MySQL DATE_FORMAT() 函数
56.MySQL DATEDIFF() 函数
57.MySQL DATE_SUB() 函数
58.MySQL DATE_ADD() 函数
59.MySQL EXTRACT() 函数
60.MySQL DATE() 函数
61.MySQL CURTIME() 函数
62.MySQL CURDATE() 函数
63.MySQL NOW() 函数
64.SQL Server CONVERT() 函数
65.SQL Server DATEDIFF() 函数
66.SQL Server DATEADD() 函数
67.SQL Server DATEPART() 函数
68.SQLite 命令
69.SQLite 安装
70.SQLite 简介
71.SQLite 运算符
72.SQLite Select 语句
73.SQLite 删除表
74.SQLite 创建表
75.SQLite Insert 语句
76.SQLite 分离数据库
77.SQLite 附加数据库
78.SQLite 创建数据库
79.SQLite 数据类型
80.SQLite 语法
81.SQLite Order By
82.SQLite Limit 子句
83.SQLite Glob 子句
84.SQLite Like 子句
85.SQLite Delete 语句
86.SQLite Update 语句
87.SQLite AND/OR 运算符
88.SQLite Where 子句
89.SQLite 表达式
90.SQLite Distinct 关键字
91.SQLite Having 子句
92.SQLite Group By
93.SQLite Join
94.SQLite 约束
95.SQLite PRAGMA
96.SQLite 事务
97.SQLite 视图
98.SQLite Truncate Table
99.SQLite Alter 命令
100.SQLite Indexed By