从 SQLite 3.5.9 迁移到 3.6.0(二十一)

 返回:SQLite—系列文章目录   

上一篇:从 SQLite 3.4.2 迁移到 3.5.0(二十)

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

SQLite 版本 3.6.0 (2008-07-16) 包含许多更改。按照惯例 SQLite项目,大多数更改都是完全向后兼容的。 但是,版本 3.6.0 中的一些更改不兼容,并且 可能需要修改应用程序代码和/或生成文件。 本文档简要介绍了 SQLite 3.6.0 中的变化 特别注意不兼容的更改。

要点:
  • 数据库文件格式保持不变。
  • 所有不兼容都位于晦涩难懂的接口上,因此应该 对大多数应用程序的影响为零。

1.0 不兼容的更改

首先涵盖不兼容的更改,因为它们是最 对维护者和程序员很重要。

1.1 不兼容更改概述

  1. 对 sqlite3_vfs 对象的更改

    1. xAccess 方法的签名已修改为 返回错误代码并将其输出存储到指向的整数中 到,而不是直接返回输出。 此更改允许 xAccess() 方法报告失败。 与此签名更改相关联,新的 添加了扩展错误代码SQLITE_IOERR_ACCESS。

    2. xGetTempname 方法已从sqlite3_vfs中删除。 取而代之的是,xOpen 方法得到了增强,可以打开临时文件 当 filename 参数为 NULL 时,它自己发明的。

    3. 添加了 xGetLastError() 方法到sqlite3_vfs以返回 特定于文件系统的错误消息和错误代码返回 SQLite的。

  2. 修改了 sqlite3_io_methods 上 xCheckReservedLock 方法的签名,以便它返回错误代码并存储其 布尔结果转换为参数指向的整数。在 与此更改关联,添加了新的扩展错误代码SQLITE_IOERR_CHECKRESERVEDLOCK。

  3. 当SQLite被移植到新的操作系统(操作系统 Unix、Windows 和 OS/2 除外,这些端口一起提供 与核心) 两个新函数 sqlite3_os_init() 和 sqlite3_os_end() 必须 作为端口的一部分提供。

  4. IN 和 NOT IN 运算符处理 NULL 值的方式 在他们的右手表达中已经符合 SQL 标准和其他 SQL 数据库引擎。

  5. SELECT 语句的结果集的列名具有 在某些情况下进行了调整,使其更像其他 SQL 数据库一样工作 发动机。

  6. 对编译时选项的更改:

    1. SQLITE_MUTEX_APPDEF compile-time 参数不再是 认可。作为替代,可以创建替代互斥锁实现 在运行时将 sqlite3_config() 与 SQLITE_CONFIG_MUTEX 运算符和 sqlite3_mutex_methods 对象一起使用。

    2. 编译时选项 OS_UNIX、OS_WIN、OS_OS2、OS_OTHER和 TEMP_STORE已重命名,以按顺序包含“SQLITE_”前缀 以帮助避免与应用程序软件的命名空间冲突。这 这些选项的新名称分别是: SQLITE_OS_UNIX、SQLITE_OS_WIN、SQLITE_OS_OS2、SQLITE_OS_OTHER、 和SQLITE_TEMP_STORE。

1.2 对 VFS 层的更改

SQLite 版本 3.5.0 引入了一个新的操作系统接口层, 提供了底层操作系统的抽象。 这是一项重要的创新,并已被证明是有帮助的 在移植和维护 SQLite 中。 但是,开发人员发现了一些小缺陷 3.5.0 版中引入的原始“虚拟文件系统”设计 因此,SQLite 3.6.0包含一些不兼容的小更改 来解决这些缺陷。

眼:不相容的 版本 3.6.0 的 SQLite 操作系统界面中的更改 仅影响使用 虚拟文件系统接口的罕见应用程序或 提供应用程序定义的 互斥锁实现或使用其他晦涩难懂的编译时选项。这 SQLite 3.6.0 版引入的更改对 绝大多数使用内置接口的 SQLite 应用程序 到 Unix、Windows 和 OS/2,并使用标准构建配置。

1.3 IN 运算符处理 NULL 的方式的变化

SQLite的所有版本(包括3.5.9版本)都处理不当 IN 和 NOT IN 运算符右侧的 NULL 值。 具体来说,SQLite以前忽略了右侧的NULL 的 IN 和 NOT IN。

假设我们有一个表 X1,定义如下:

  CREATE TABLE x1(x INTEGER);
  INSERT INTO x1 VALUES(1);
  INSERT INTO x1 VALUES(2);
  INSERT INTO x1 VALUES(NULL);

鉴于上面 X1 的定义,以下表达式具有 在SQLite中历来评估为FALSE,尽管是正确的 答案实际上是 NULL:

  3 IN (1,2,NULL)
  3 IN (SELECT * FROM x1)

同样,以下表达式历来计算为 TRUE,实际上 NULL 也是这里的正确答案:

  3 NOT IN (1,2,NULL)
  3 NOT IN (SELECT * FROM x1)

根据 SQL:1999,SQLite 的历史行为不正确 标准,它与 MySQL 和 PostgreSQL。版本 3.6.0 更改了 IN 和 NOT IN运算符符合标准并给出相同的标准 结果与其他 SQL 数据库引擎一样。

眼:对 NULL 值处理方式的更改 从技术上讲,IN 和 NOT IN 运算符是错误修复,而不是设计 改变。但是,维护人员应检查以确保应用程序 在升级到 版本 3.6.0。

1.4 列命名规则的更改

联接子查询报告的列名略有修改 为了更像其他数据库引擎一样工作。请考虑以下几点 查询:

  CREATE TABLE t1(a);
  CREATE TABLE t2(x);
  SELECT * FROM (SELECT t1.a FROM t1 JOIN t2 ORDER BY t2.x LIMIT 1) ORDER BY 1;

在版本 3.5.9 中,上面的查询将返回一个名为“t1.a”的列。 在版本 3.6.0 中,列名称仅为“a”。

SQLite 从未对 SELECT 语句的结果集,除非该列包含 AS 子句。 因此,从技术上讲,对列名的更改并不是不兼容的。 SQLite只是从一个未定义的行为更改为另一个未定义的行为。 然而,许多应用程序依赖于未指定的列命名 SQLite 的行为,因此此更改将在 不兼容的更改副标题。

1.5 编译时选项的更改

SQLite 的编译时选项由 C 预处理器控制 宏。SQLite 版本 3.6.0 更改了其中一些的名称 宏,以便所有特定于 SQLite以“SQLITE_”前缀开头。这样做是为了减少 与其他软件模块发生名称冲突的风险。

眼:对编译时选项的更改具有 可能会影响执行自定义构建的项目中的生成文件 SQLite的。这些更改对应用程序代码的影响应为零,并且 大多数使用标准、默认构建的 SQLite 的项目。

2.0 完全向后兼容的增强功能

除了上面列出的不兼容的更改外,SQLite 版本 3.6.0 添加了以下向后兼容的更改和 增强:

  1. 新的 sqlite3_config() 接口允许应用程序 自定义 SQLite 在运行时的行为。可定制 使用 sqlite3_config() 包括以下内容:

    1. 使用带有 sqlite3_mutex_methods 对象的 SQLITE_CONFIG_MUTEX 谓词指定备用互斥锁实现。

    2. 使用带有 sqlite3_mem_methods 对象的 SQLITE_CONFIG_MALLOC 谓词指定替代 malloc 实现。

    3. 部分或完全禁用使用 SQLITE_CONFIG_SINGLETHREAD、SQLITE_CONFIG_MULTITHREAD 和 SQLITE_CONFIG_SERIALIZED 的互斥锁。

  2. 一个新的标志SQLITE_OPEN_NOMUTEX可用于 sqlite3_open_v2() 接口。

  3. 新的 sqlite3_status() 接口允许应用程序查询 SQLite在运行时的性能状态。

  4. sqlite3_memory_used() 和 sqlite3_memory_highwater() 接口已弃用。等效功能现已推出 通过 sqlite3_status()。

  5. 可以显式调用 sqlite3_initialize() 接口 初始化 SQLite 子系统。sqlite3_initialize() 接口是 调用某些接口时自动调用,因此不需要使用 sqlite3_initialize(),但建议使用。

  6. sqlite3_shutdown() 接口导致 SQLite 释放任何 系统资源(内存分配、互斥锁、打开文件句柄) 这可能是由 sqlite3_initialize() 分配的。

  7. sqlite3_next_stmt() 接口允许应用程序发现 与数据库连接关联的所有预准备语句。

  8. 添加了page_count PRAGMA,用于返回基础的大小 数据库文件(以页面为单位)。

  9. 添加了新的 R*Tree 索引扩展。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/536182.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

中移物联网 OneOS 操作系统环境搭建和工程创建

一、官网 OneOS Lite是中国移动针对物联网领域推出的轻量级操作系统,具有可裁剪、跨平台、低功耗、高安全等特点,支持ARM Cortex-A和 Cortex-M、MIPS、RISC-V等主流芯片架构,兼容POSIX、CMSIS等标准接口,支持Javascript、MicroPyt…

Ubuntu下配置Android NDK环境

Android-NDK的下载 下载Android-NDK wget -c http://dl.google.com/android/ndk/android-ndk-r10e-linux-x86_64.bin 执行bin文件(即解压) ./android-ndk-r10c-linux-x86_64.bin Android-NDK的配置 要想使用Android-NDK,还需要进行环境变量…

C++ stl容器string的底层模拟实现

目录 前言: 1.成员变量 2.构造函数与拷贝构造函数 3.析构函数 4.赋值重载 5.[]重载 6.比较关系重载 7.reserve 8.resize 9.push_back,append和重载 10.insert 11.erase 12.find 14.迭代器 15.流插入,流提取重载 16.swap 17.c_str 18.完…

Testng测试框架(6)--@Factory动态地创建测试类的实例

工厂允许您动态地创建测试。例如,假设您想创建一个测试方法,该方法将多次访问网站上的某个页面,并且您希望使用不同的值来调用它。 public class TestWebServer {Test(parameters { "number-of-times" })public void accessPage(…

【C++题解】1605. 求一个两位数的个位和十位的和

问题:1605. 求一个两位数的个位和十位的和 类型:基本运算、拆位求解。 题目描述: 从键盘读入一个两位的整数 n ,请求出这个两位整数个位和十位的和是多少? 输入: 一个两位的整数 n 。 输出&#xff1a…

hbase基础shell用法

HBase中用create命令创建表,具体如下: create student,Sname,Ssex,Sage,Sdept,course 此时,即创建了一个“student”表,属性有:Sname,Ssex,Sage,Sdept,course。因为HBase的表中会有一个系统默认的属性作为行键&#x…

【MySQL】事务篇

SueWakeup 个人主页:SueWakeup 系列专栏:学习技术栈 个性签名:保留赤子之心也许是种幸运吧 目录 本系列专栏 1. 什么是事务 2. 事务的特征 原子性(Atomicity) 一致性(Consistency) 隔离性&…

255Mesh 无线lora模块详细配置和测试

一、型号介绍 字符含义: E:终端 N:节点(node) G:网关 (gateway) 官网淘宝介绍 注意:组网必须配网关。 二、功能配置 软件界面 1.网络参数 网络参数包括网络 ID&a…

华为OD技术面试-有序数组第K最小值

背景 2024-03-15华为od 二面,记录结题过程 有序矩阵中第 K 小的元素 - 力扣(LeetCode) https://leetcode.cn/problems/kth-smallest-element-in-a-sorted-matrix/submissions/512483717/ 题目 给你一个 n x n 矩阵 matrix ,其…

FPGA基于VCU的H265视频压缩,HDMI2.0输入,支持4K60帧,提供工程源码+开发板+技术支持

目录 1、前言免责声明 2、相关方案推荐我这里已有的视频图像编解码方案 3、详细设计方案设计框图FPGA开发板视频输入Video PHY ControllerHDMI 1.4/2.0 Receiver SubsystemVideo Processing SubsystemVideo Frame Buffer WriteZynq UltraScale VCUPetaLinux 系统制作VLC播放器工…

ubuntu安装irtualbox注意事项

下载官网7.0版本,ubuntu22.04,安装一直出错误,查到了下面兄弟的办法,仍然不幸,最后使用apt重装,请按第二部分流程安装,安装6.1,可以用 第一部分,反正我是没搞通,7.0反复的出现相同的…

在 Leetcode 上使用 Javascript 查找数组中的所有重复项(使用 JS 的 DSA)

在本篇博客文章中,我们将探讨如何在数组中找出所有重复的元素,这个问题源自LeetCode上的一个问题。 问题描述: 我们有一个包含n个整数的数组,所有整数都在范围[1, n]内。每个整数要么出现一次,要么出现两次。任务是找…

第8章 项目整合管理

子过程:为创建预定的产品、服务或成果而执行的一系列相互关联的行动和活动; 既属于某一过程组(启动、规划、执行、监控、收尾)又属于某一知识领域(整合、范围、进度、成本、质量、资源、采购、沟通、干系人、风险&…

5G智慧水利数字孪生可视化平台,推进水利行业数字化转型

5G智慧水利数字孪生可视化平台,推进水利行业数字化转型。随着5G技术的快速发展,越来越多的行业开始探索数字化转型的道路。水利行业作为国民经济的重要支柱,也面临着数字化转型的迫切需求。5G智慧水利数字孪生可视化平台作为水利行业数字化转…

数据安全之路:Databend 用户与角色管理应用

Databend 目前支持基于角色的访问控制 (RBAC) 和 自主访问控制 (DAC) 模型,用于访问控制功能。 通过本指南,我们会了解权限和角色在 Databend 中的基本概念,以及如何管理角色、继承角色与建立层级、设置默认角色以及所有权的重要性。这些功能…

活动预告|NineData 创始人CEO叶正盛将参加QCon全球软件开发大会,共话AI大模型技术在数据库DevOps的实践

4月13日下午,NineData创始人&CEO叶正盛即将参加InfoQ中国主办的『QCon全球软件开发大会北京站』的技术大会。在本次技术峰会上,叶正盛将以《AI大模型技术在数据库DevOps的实践》为主题,深入剖析AI大模型技术在数据库DevOps领域的最新进展…

逆向案例二十一——遇到混淆怎么办

开始新的板块尝试,混淆了怎么办 网址:极简壁纸_海量电脑桌面壁纸美图_4K超高清_最潮壁纸网站 抓包抓到,好久没做解密了,奥里给干他!: 搜索关键字,打上断点,点击第二页。 _0x10a345…

SOLIDOWRKS怎么将中间格式的模具装配体转化为装配体格式

模具是工业生产中用于制作成型物品的工具,它由各种零件构成,可以通过改变所成型材料的物理状态来实现物品外形的加工。如果工程师已经有其他格式的模具装配体,但是又想将其他格式的模具装配体导入solidworks里面,并且将一个个实体…

rust wasm入门

📕作者简介: 过去日记,致力于Java、GoLang,Rust等多种编程语言,热爱技术,喜欢游戏的博主。 📘相关专栏Rust初阶教程、go语言基础系列、spring教程等,大家有兴趣的可以看一看 📙Jav…

SpringBoot修改菜品模块开发

需求分析与设计 一:产品原型 在菜品管理列表页面点击修改按钮,跳转到修改菜品页面,在修改页面回显菜品相关信息并进行修改,最后点击保存按钮完成修改操作。 修改菜品原型: 二:接口设计 通过对上述原型图…