Materialize项目中的SQL逻辑测试(SQLLogicTest)深度指南

Materialize项目中的SQL逻辑测试(SQLLogicTest)深度指南

materialize The data warehouse for operational workloads. materialize 项目地址: https://gitcode.com/gh_mirrors/mat/materialize

概述

SQL逻辑测试(SQLLogicTest)是Materialize项目中用于验证SQL功能正确性的重要测试框架。本文将深入解析Materialize项目中SQLLogicTest的扩展功能和使用技巧,帮助开发者编写高质量的SQL测试用例。

测试编写规范

函数测试要点

在Materialize中测试新函数时,需要特别注意以下几点:

  1. NULL值处理:必须测试两种NULL场景

    • 直接NULL输入:select func(NULL)
    • 表中包含NULL的列:select func(col) from atable
  2. 数值边界测试:对于数值型参数,必须测试:

    • 0值情况
    • 负数情况
    • 特殊值如1、±∞等

类型验证最佳实践

避免使用预期数据类型来验证结果列的数据类型,因为SQLLogicTest会尝试将结果强制转换为预期类型。推荐做法是使用SHOW COLUMNS命令来验证实际数据类型。

对于布尔值结果,虽然支持转换为T(文本)、B(布尔)和I(整数)三种类型,但建议新测试统一使用T类型。

错误测试方法

Materialize扩展了错误测试语法:

statement error <可选错误信息>
<你的SQL语句>

query error <可选错误信息>
<你的查询语句>

区别在于:

  • query error仅适用于SELECT、CREATE VIEW和SHOW INDEXES语句
  • statement error适用于任何类型的语句

主键支持

虽然Materialize本身暂不支持创建带主键的表,但在SQLLogictest中可以声明主键,优化器会考虑这些主键约束。

语法示例:

CREATE TABLE foo (a INT PRIMARY KEY, b INT)

CREATE TABLE bar (
    a smallint,
    b integer,
    c char(10),
    d char(20),
    PRIMARY KEY (a, b)
)

Materialize特有扩展功能

服务器重置

默认情况下,SQLLogicTest会创建一个Materialize实例并运行所有测试。使用reset-server指令可以创建新的干净实例,特别适用于:

  • 涉及对象ID的测试(如EXPLAIN测试)
  • 需要访问内省表的测试

simple扩展指令

Materialize扩展了simple指令,用于执行简单查询(使用pgwire协议),特别适合测试:

  • 多语句查询
  • 隐式事务

示例:

simple conn=mz_system,user=mz_system
<SQL语句>

支持可选参数:

  • conn:指定连接名称(支持多连接测试)
  • user:指定连接用户
  • multiline:支持多行输出

copy扩展指令

copy指令用于测试COPY FROM功能:

copy table path/to/file.csv

等效于执行:

COPY table FROM STDIN

测试模式详解

Materialize支持两种测试模式:

  1. standard模式:兼容SQLite测试
  2. cockroach模式:兼容CockroachDB测试

模式差异对比

  1. 空格处理

    • standard模式:仅列名中的空格作为分隔符
    • cockroach模式:除单列外,所有空格都作为分隔符
    • 特殊字符:使用␠(U+2420)表示需要保留的空格
  2. 数值精度处理

    • standard模式:
      • Decimal类型:scale=0时显示4位小数,否则显示3位
      • Float类型:固定显示3位小数
    • cockroach模式:
      • 严格遵循Decimal的scale定义
      • Float显示完整精度
  3. 数值舍入规则

    • standard模式:向下取整
    • cockroach模式:四舍五入(中间值向上舍入)

多行文本支持

使用multiline关键字可以测试包含换行符的文本输出:

query T multiline
select 'hello
 world'
----
hello
 world
EOF

实用技巧

  1. 结果重写:使用--rewrite-results参数自动更新预期结果

    bin/sqllogictest -- --rewrite-results <测试文件路径>
    
  2. 调试方法:可以通过LLDB或GDB调试测试

    bin/sqllogictest --wrapper 'rust-lldb --' -- <测试文件路径>
    
  3. 语法高亮:VS Code用户可以使用专门的sqllogictest语法高亮插件

不支持的指令

Materialize的SQLLogicTest会跳过以下不支持的指令:

  • CREATE UNIQUE INDEX
  • REINDEX

对于CockroachDB的partialsort扩展,目前会转换为rowsort处理。

内部实现参考

如需修改SQLLogicTest相关代码,可参考以下关键部分:

  1. 测试运行器:处理查询传递和结果处理

    • 不应修改结果格式化逻辑(确保兼容性)
    • 新数据类型应强制转换为现有结果类型
  2. 协调器:处理来自PostgreSQL的变更日志

    • 关键点:Plan::CreateTablePlan::SendDiffs

通过本文的详细介绍,开发者可以更有效地为Materialize项目编写SQL逻辑测试,确保SQL功能的正确性和稳定性。

materialize The data warehouse for operational workloads. materialize 项目地址: https://gitcode.com/gh_mirrors/mat/materialize

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

资源下载链接为: https://pan.quark.cn/s/3d8e22c21839 随着 Web UI 框架(如 EasyUI、JqueryUI、Ext、DWZ 等)的不断发展与成熟,系统界面的统一化设计逐渐成为可能,同时代码生成器也能够生成符合统一规范的界面。在这种背景下,“代码生成 + 手工合并”的半智能开发模式正逐渐成为新的开发趋势。通过代码生成器,单表数据模型以及一对多数据模型的增删改查功能可以被直接生成并投入使用,这能够有效节省大约 80% 的开发工作量,从而显著提升开发效率。 JEECG(J2EE Code Generation)是一款基于代码生成器的智能开发平台。它引领了一种全新的开发模式,即从在线编码(Online Coding)到代码生成器生成代码,再到手工合并(Merge)的智能开发流程。该平台能够帮助开发者解决 Java 项目中大约 90% 的重复性工作,让开发者可以将更多的精力集中在业务逻辑的实现上。它不仅能够快速提高开发效率,帮助公司节省大量的人力成本,同时也保持了开发的灵活性。 JEECG 的核心宗旨是:对于简单的功能,可以通过在线编码配置来实现;对于复杂的功能,则利用代码生成器生成代码后,再进行手工合并;对于复杂的流程业务,采用表单自定义的方式进行处理,而业务流程则通过工作流来实现,并且可以扩展出任务接口,供开发者编写具体的业务逻辑。通过这种方式,JEECG 实现了流程任务节点和任务接口的灵活配置,既保证了开发的高效性,又兼顾了项目的灵活性和可扩展性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

邴坤鸿Jewel

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值