SQLGlot解析PostgreSQL中LATERAL与WITH ORDINALITY组合查询的问题分析
在SQL解析器SQLGlot的最新版本26.12.1中,我们发现了一个关于PostgreSQL特有语法解析的兼容性问题。这个问题涉及到PostgreSQL中两个强大的功能特性组合使用时的解析失败:LATERAL连接和WITH ORDINALITY子句。
PostgreSQL的LATERAL关键字允许子查询引用前面FROM项中的列,这在处理JSON数组等复杂数据类型时特别有用。而WITH ORDINALITY则为集合返回函数添加一个序号列,方便跟踪元素的原始位置。这两种功能在PostgreSQL中可以合法组合使用,但在SQLGlot中却引发了解析错误。
让我们深入分析这个问题的技术细节。在PostgreSQL中,当我们使用jsonb_array_elements这类集合返回函数时,可以同时应用LATERAL和WITH ORDINALITY。例如,以下查询是完全合法的:
SELECT *
FROM test_data,
LATERAL jsonb_array_elements(data) WITH ORDINALITY AS elem(value, ordinality);
这个查询会展开test_data表中data列的JSON数组,同时为每个元素添加一个序号。LATERAL确保我们可以引用前面test_data表的data列,WITH ORDINALITY则提供元素的顺序信息。
然而,SQLGlot的PostgreSQL方言解析器在处理这种组合语法时会出现ParseError。通过测试发现,单独使用LATERAL或WITH ORDINALITY都能正确解析,但两者结合就会失败。这表明解析器的语法规则在处理这种特定组合时存在缺陷。
从技术实现角度看,这可能是由于解析器的语法规则未能正确识别WITH ORDINALITY作为LATERAL修饰后的集合函数的有效后缀。在PostgreSQL的语法规范中,WITH ORDINALITY实际上是集合返回函数的一部分,而不是独立的子句,这种细微的语法差异可能导致解析器误判。
对于开发者来说,这个问题的影响在于:任何尝试使用SQLGlot解析包含这种组合语法的PostgreSQL查询都会失败,即使这些查询在PostgreSQL中完全有效。这限制了SQLGlot在需要处理复杂JSON数据场景中的应用,特别是在需要保持元素顺序信息的ETL流程中。
解决这个问题的方向应该是扩展SQLGlot的PostgreSQL方言解析器,使其能够正确识别LATERAL与WITH ORDINALITY的组合语法模式。这需要对解析器的语法规则进行适当调整,确保它能正确处理集合返回函数的各种修饰组合。
这个问题也提醒我们,在实现SQL方言解析器时,需要特别注意各种语法元素的组合可能性,特别是像PostgreSQL这样功能丰富的数据库系统,其语法组合往往比标准SQL更加灵活多样。
kernelopenEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。C033
Kimi-K2-ThinkingKimi K2 Thinking 是最新、性能最强的开源思维模型。从 Kimi K2 开始,我们将其打造为能够逐步推理并动态调用工具的思维智能体。通过显著提升多步推理深度,并在 200–300 次连续调用中保持稳定的工具使用能力,它在 Humanity's Last Exam (HLE)、BrowseComp 等基准测试中树立了新的技术标杆。同时,K2 Thinking 是原生 INT4 量化模型,具备 256k 上下文窗口,实现了推理延迟和 GPU 内存占用的无损降低。Python00
kylin-wayland-compositorkylin-wayland-compositor或kylin-wlcom(以下简称kywc)是一个基于wlroots编写的wayland合成器。 目前积极开发中,并作为默认显示服务器随openKylin系统发布。 该项目使用开源协议GPL-1.0-or-later,项目中来源于其他开源项目的文件或代码片段遵守原开源协议要求。C00
HunyuanOCRHunyuanOCR 是基于混元原生多模态架构打造的领先端到端 OCR 专家级视觉语言模型。它采用仅 10 亿参数的轻量化设计,在业界多项基准测试中取得了当前最佳性能。该模型不仅精通复杂多语言文档解析,还在文本检测与识别、开放域信息抽取、视频字幕提取及图片翻译等实际应用场景中表现卓越。00
GLM-4.7GLM-4.7上线并开源。新版本面向Coding场景强化了编码能力、长程任务规划与工具协同,并在多项主流公开基准测试中取得开源模型中的领先表现。 目前,GLM-4.7已通过BigModel.cn提供API,并在z.ai全栈开发模式中上线Skills模块,支持多模态任务的统一规划与协作。Jinja00
GLM-TTSGLM-TTS 是一款基于大语言模型的高质量文本转语音(TTS)合成系统,支持零样本语音克隆和流式推理。该系统采用两阶段架构,结合了用于语音 token 生成的大语言模型(LLM)和用于波形合成的流匹配(Flow Matching)模型。 通过引入多奖励强化学习框架,GLM-TTS 显著提升了合成语音的表现力,相比传统 TTS 系统实现了更自然的情感控制。Python00
Spark-Formalizer-X1-7BSpark-Formalizer 是由科大讯飞团队开发的专用大型语言模型,专注于数学自动形式化任务。该模型擅长将自然语言数学问题转化为精确的 Lean4 形式化语句,在形式化语句生成方面达到了业界领先水平。Python00