当前位置: 首页 > news >正文

SQLite的架构(十一)

返回:SQLite—系列文章目录   

上一篇:SQLite下一代查询规划器(十)

下一篇:SQLite—系列文章目录   

介绍

本文档介绍SQLite库的架构。 这里的信息对那些想要了解或 修改SQLite的内部工作原理。

接口SQL 命令处理器虚拟机B-树呼叫器操作系统接口分词器解析 器法典发电机公用事业测试代码核心后端SQL 编译器辅料

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

概述

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

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

接口

大部分 C 语言接口都可以在源代码中找到 文件 main.c、legacy.c 和 vdbeapi.c,尽管某些例程是 分散在他们可以访问数据的其他文件中 具有文件范围的结构。 sqlite3_get_table() 例程在 table.c 中实现。 sqlite3_mprintf() 例程位于 printf.c 中。 sqlite3_complete() 接口位于 complete.c 中。 TCL 接口由 tclsqlite.c 实现。

为避免名称冲突,所有外部 SQLite 库中的符号以前缀 sqlite3 开头。 那些供外部使用的符号(换句话说, 那些构成 API for SQLite 的符号)添加下划线,以及 因此,从sqlite3_开始。扩展 API 有时会添加 下划线前的扩展名;例如:sqlite3rbu_ 或 sqlite3session_

分词器

当要计算包含 SQL 语句的字符串时,它是 首先发送到分词器。 分词器中断 将 SQL 文本转换为令牌并传递这些令牌 一个接一个地到解析器。分词器是手动编码的 文件 tokenize.c.

请注意,在此设计中,分词器调用分析器。人 熟悉YACC和BISON的人可能习惯于做事 另一种方式 - 让解析器调用分词器。拥有 不过,分词器调用解析器更好,因为它可以制作 线程安全,它运行得更快。

解析 器

解析器根据 他们的背景。SQLite 的解析器是使用 Lemon 解析器生成器生成的。 Lemon 的工作与 YACC/BISON 相同,但它使用 一种不同的输入语法,不易出错。 Lemon 还生成了一个可重入且线程安全的解析器。 Lemon 定义了非终端析构函数的概念,所以 当遇到语法错误时,它不会泄漏内存。 驱动 Lemon 并定义 SQL 语言的语法文件 SQLite 理解的内容可以在 parse.y 中找到。

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

代码生成器

解析器将令牌组装到解析树中后, 代码生成器运行以分析解析树并生成执行 SQL 语句工作的字节码。 预准备语句对象是此字节码的容器。 代码生成器中有许多文件,包括:attach.c、auth.c、build.c、delete.c、expr.c、insert.c、pragma.c、select.c、trigger.c、update.c、vacuum.c、where.c、wherecode.c 和 whereexpr.c。 在这些文件中,大多数严肃的魔术都发生了。expr.c 处理表达式的代码生成。where*.c 处理 WHERE 子句的代码生成 SELECT、UPDATE 和 DELETE 语句。文件 attach.c、delete.c、insert.c、select.c、trigger.c update.c 和 vacuum.c 处理代码生成 对于具有相同名称的 SQL 语句。(每个文件都调用例程 必要时在 expr.c 和 where.c 中。所有其他 SQL 语句是从 build.c 中编码出来的。 auth.c 文件实现了 sqlite3_set_authorizer() 的功能。

代码生成器,尤其是 where*.c 和 select.c 中的逻辑,有时称为查询规划器。对于任何特定的 SQL 语句,可能有 成百上千或数百万种不同的算法进行计算 答案是。查询计划器是一个 AI,它努力选择 这数百万种选择中的最佳算法。

字节码引擎

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

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

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

B-树

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

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

页面缓存

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

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

操作系统接口

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

公用事业

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

测试代码

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

相关文章:

SQLite的架构(十一)

返回:SQLite—系列文章目录 上一篇:SQLite下一代查询规划器(十) 下一篇:SQLite—系列文章目录 介绍 本文档介绍SQLite库的架构。 这里的信息对那些想要了解或 修改SQLite的内部工作原理。 接口SQL 命令处理器虚拟机B-树…...

Vue2电商前台项目(一):项目前的初始化及搭建

一、项目初始化 创建项目:sudo vue create app 1.项目配置 (1)浏览器自动打开 在package.json文件中,serve后面加上 --open "scripts": {"serve": "vue-cli-service serve --open","buil…...

4.6 offset指令,jmp short指令,far,dword ptr各种跳转指令

4.6 offset指令,jmp short指令,far,dword ptr各种跳转指令 可以修改IP,或同时修改CS和IP的指令统称为转移指令。概括的讲,转移指令就是可以控制CPU执行内存中某处代码的指令 1. 转移指令 1.1 8086CPU的转移行为有以…...

【WEEK5】 【DAY5】DML语言【中文版】

2024.3.29 Friday 目录 3.DML语言3.1.外键(了解)3.1.1.概念3.1.2.作用3.1.3.添加(书写)外键的几种方法3.1.3.1.创建表时直接在主动引用的表里写(被引用的表的被引用的部分)3.1.3.2.先创建表后修改表以添加…...

媒体偏见从何而来?--- 美国MRC(媒体评级委员会)为何而生?

每天当我们打开淘宝,京东,步入超市,逛街或者逛展会,各种广告铺天盖地而来。从原来的平面广告,到多媒体广告,到今天融合AR和VR技术的数字广告,还有元宇宙虚拟世界,还有大模型加持的智…...

Solana 线下活动回顾|多方创新实践,引领 Solana“文艺复兴”新浪潮

Solana 作为在过去一年里实现突破式飞跃的头部公链,究竟是如何与 Web3 行业共振,带来全新的技术发展与生态亮点的呢?在 3 月 24 日刚结束的「TinTin Destination Moon」活动现场,来自 Solana 生态的的专家大咖和 Web3 行业的资深人…...

CSS3 实现文本与图片横向无限滚动动画

文章目录 1. 实现效果2.html结构3. css代码 1. 实现效果 gif录屏比较卡&#xff0c;实际很湿滑&#xff0c;因为是css动画实现的 2.html结构 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"…...

Android 性能优化之黑科技开道(一)

1. 缘起 在开发电视版智家 App9.0 项目的时候&#xff0c;发现了一个性能问题。电视系统原本剩余的可用资源就少&#xff0c;而随着 9.0 功能的进一步增多&#xff0c;特别是门铃、门锁、多路视频同屏监控后等功能的增加&#xff0c;开始出现了卡顿情况。 经过调研分析发现有…...

Successive Convex Approximation算法的学习笔记

文章目录 一、代码debug二、原理 本文主要参考了CSDN上的 另一篇文章&#xff0c;但规范了公式的推导过程和修缮了部分代码 一、代码debug 首先&#xff0c;我们将所有的代码放到MATLAB中&#xff0c;很快在命令行中出现了错误信息 很显然有问题&#xff0c;但是我不知道发生…...

IoT数采平台2:文档

IoT数采平台1&#xff1a;开篇IoT数采平台2&#xff1a;文档IoT数采平台3&#xff1a;功能IoT数采平台4&#xff1a;测试 【平台功能】 基础配置、 实时监控、 规则引擎、 告警列表、 系统配置 消息通知&#xff1a;Websocket 设备上线、设备下线、 数据变化、 告警信息、 实时…...

Vue监听器watch的基本用法

文章目录 1. 作用2. 格式3. 示例3.1 value 值为字符串3.2 value 值为函数3.3 value 值为对象 4. 与计算属性对比 1. 作用 监视数据变化&#xff0c;执行一些业务逻辑或异步操作。 2. 格式 监听器 watch 内部以 key &#xff1a;value 的形式定义&#xff0c;key 是 data 中的…...

MySQL UPDATE JOIN 根据一张表或多表来更新另一张表的数据

当使用MySQL时&#xff0c;经常需要根据一张表或多张表的数据来更新另一张表的数据。这种情况下&#xff0c;我们可以使用UPDATE语句结合JOIN操作来实现这一需求。本文将介绍MySQL中使用UPDATE JOIN的技术。 什么是UPDATE JOIN UPDATE JOIN是MySQL中一种结合UPDATE语句和JOIN…...

JS实现继承的方式ES6版

上一篇&#xff1a;JS实现继承的方式原生版 ES6的继承 主要是依赖extends关键字来实现继承&#xff0c;且继承的效果类似于寄生组合继承。 class Parent() { }class Child extends Parent {constructor(x, y, color) {super(x, y);this.color color;} }子类必须在construct…...

elementui 左侧或水平导航菜单栏与main区域联动

系列文章目录 一、elementui 导航菜单栏和Breadcrumb 面包屑关联 二、elementui 左侧导航菜单栏与main区域联动 三、elementui 中设置图片的高度并支持PC和手机自适应 四、elementui 实现一个固定位置的Pagination&#xff08;分页&#xff09;组件 文章目录 系列文章目录…...

YUNBEE云贝-技术分享:PostgreSQL分区表

引言 PostgreSQL作为一款高度可扩展的企业级关系型数据库管理系统&#xff0c;其内置的分区表功能在处理大规模数据场景中扮演着重要角色。本文将深入探讨PostgreSQL分区表的实现逻辑、详细实验过程&#xff0c;并辅以分区表相关的视图查询、分区表维护及优化案例&#xff0c;…...

5.2 通用代码,数组求和,拷贝数组,si配合di翻转数组

5.2 通用代码&#xff0c;数组求和&#xff0c;拷贝数组&#xff0c;si配合di翻转数组 1. 通用代码 通用代码类似于一个用汇编语言写程序的一个框架&#xff0c;也类似于c语言的头文件编写 assume cs:code,ds:data,ss:stack data segmentdata endsstack segmentstack endsco…...

Oracle23免费版简易安装攻略

installation-guide 1 安装 root用户下 wget https://yum.oracle.com/repo/OracleLinux/OL8/developer/x86_64/getPackage/oracle-database-preinstall-23c-1.0-1.el8.x86_64.rpm wget https://download.oracle.com/otn-pub/otn_software/db-free/oracle-database-free-23c-1…...

《论文阅读》一种基于反事实推理的会话情绪检测无训练去偏框架 EMNLP 2023

《论文阅读》一种基于反事实推理的会话情绪检测无训练去偏框架 EMNLP 2023 前言简介相关工作模型构架Basic ClassificationBias ExtractionUnbiased Inference实验结果前言 亲身阅读感受分享,细节画图解释,再也不用担心看不懂论文啦~ 无抄袭,无复制,纯手工敲击键盘~ 今天…...

基于springboot+vue的健身房管理预约管理系统

...

【编译lombok问题】已解决:编译突然找不到符号问题-get/set找不到符号

一、场景&#xff1a;编译突然找不到符号 报错信息&#xff1a; 找不到符号 符号&#xff1a;方法getName() 二、原因&#xff1a; 没有使用lombok支持的编译器 三、解决方法&#xff1a; 打开File-Settings&#xff0c;按以下步骤进行设置&#xff1b; 修改&#xff1a;-Djp…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

Python 训练营打卡 Day 47

注意力热力图可视化 在day 46代码的基础上&#xff0c;对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...

用递归算法解锁「子集」问题 —— LeetCode 78题解析

文章目录 一、题目介绍二、递归思路详解&#xff1a;从决策树开始理解三、解法一&#xff1a;二叉决策树 DFS四、解法二&#xff1a;组合式回溯写法&#xff08;推荐&#xff09;五、解法对比 递归算法是编程中一种非常强大且常见的思想&#xff0c;它能够优雅地解决很多复杂的…...