深入理解 MySQL 8 C++ 源码:SELECT MOD(MONTH(NOW()), 2) 的函数执行过程

news2025/2/22 11:45:48

MySQL 作为最流行的关系型数据库之一,其内部实现机制一直是开发者探索的热点。本文将以一条简单的 SQL 查询 SELECT MOD(MONTH(NOW()), 2) 为例,深入分析 MySQL 8 源码中内置函数 MODMONTH 和 NOW 的执行过程,揭示其底层实现逻辑。


一、SQL 语句的解析与表达式树构建

当 MySQL 接收到 SQL 查询时,首先会通过 解析器 将文本转化为内部的表达式树结构。对于 MOD(MONTH(NOW()), 2),解析过程如下:

  1. NOW()
    被解析为 Item_func_now 类的实例,负责返回当前时间(datetime 类型)。

  2. MONTH(NOW())
    被解析为 Item_func_month 类的实例,接受 NOW() 的结果作为输入,提取月份值(整数类型)。

  3. MOD(month_value, 2)
    被解析为 Item_func_mod 类的实例,对 MONTH() 的结果和常量 2 进行取模运算。

最终,这三个函数会形成一个嵌套的表达式树:
Item_func_mod(Item_func_month(Item_func_now()), 2)


二、关键源码文件与类定义
1. NOW() 函数的实现
  • 声明文件sql/item_timefunc.h
    类名:Item_func_now(或其派生类 Item_func_now_local/Item_func_now_utc)。
  • 实现文件sql/item_timefunc.cc
    核心方法 Item_func_now::val_datetime() 负责获取当前时间。
2. MONTH() 函数的实现
  • 声明文件sql/item_timefunc.h
    类名:Item_func_month
  • 实现文件sql/item_timefunc.cc
    核心方法 Item_func_month::val_int() 从日期中提取月份:
     
    longlong Item_func_month::val_int() {
      MYSQL_TIME ltime;
      if (get_arg0_date(&ltime, TIME_FUZZY_DATE)) return 0;
      return ltime.month; // 返回月份(1-12)
    }
3. MOD() 函数的实现
  • 声明文件sql/item_func.h
    类名:Item_func_mod
  • 实现文件sql/item_func.cc
    核心方法 Item_func_mod::int_op() 处理整数取模运算:
     
    longlong Item_func_mod::int_op() {
      longlong val1 = args[0]->val_int(); // 计算 MONTH(NOW())
      longlong val2 = args[1]->val_int(); // 常量 2
      if (val2 == 0) return 0; // 避免除零错误
      return val1 % val2;
    }

三、执行流程详解
1. 解析阶段
  • 语法解析器(sql/sql_yacc.yy)将 SQL 字符串转换为表达式树。
  • 优化器确定表达式类型(例如 Item::INT_RESULT)。
2. 执行阶段
  1. 调用 NOW()
    Item_func_now::val_datetime() 获取当前时间(例如 2023-10-05 12:34:56)。

  2. 调用 MONTH()
    Item_func_month::val_int() 从 NOW() 的结果中提取月份值(例如 10)。

  3. 调用 MOD()
    Item_func_mod::int_op() 对月份值 10 和 2 取模,最终结果为 0


四、源码定位技巧

由于代码行号可能随版本变化,建议通过以下方式快速定位关键代码:

  1. GitHub 搜索
    访问 MySQL 8.0 源码仓库,搜索 Item_func_mod 或 Item_func_month

  2. 本地代码搜索

     
    # 在 MySQL 源码根目录执行:
    grep -rn 'Item_func_mod' sql/
    grep -rn 'Item_func_month' sql/

五、关键设计思想
  1. 表达式树模型
    MySQL 通过嵌套的 Item 类对象(如 Item_func_mod)表示复杂表达式,支持递归求值。

  2. 类型推导与优化
    优化器在预处理阶段确定表达式的结果类型(如整数、浮点数),避免运行时类型转换开销。

  3. 错误处理
    内置函数需处理边界条件(如 MOD 的除零错误),返回合理默认值而非抛出异常,确保查询稳定性。


六、总结

通过分析 SELECT MOD(MONTH(NOW()), 2) 的执行过程,我们可以深入理解 MySQL 的以下机制:

  • 内置函数的实现:通过 Item_func_* 类封装逻辑。
  • 表达式求值:递归调用 val_int() 或 val_datetime() 方法。
  • 源码结构:时间函数在 item_timefunc.*,数学函数在 item_func.*

掌握这些底层细节,不仅能帮助开发者调试复杂 SQL,还能为贡献 MySQL 源码或定制内置函数奠定基础。

##MOD函数 gdb调试堆栈

#0  Item_func_mod::int_op (this=0x746cd800e280) at /home/yym/mysql8/mysql-8.1.0/sql/item_func.cc:2616
#1  0x00005591538eda46 in Item_func_numhybrid::val_int (this=0x746cd800e280) at /home/yym/mysql8/mysql-8.1.0/sql/item_func.cc:1740
#2  0x00005591538600cb in Item::send (this=0x746cd800e280, protocol=0x746cd80052c0, buffer=0x746de10f5e20) at /home/yym/mysql8/mysql-8.1.0/sql/item.cc:7483
#3  0x00005591532bf8a0 in THD::send_result_set_row (this=0x746cd8001050, row_items=...) at /home/yym/mysql8/mysql-8.1.0/sql/sql_class.cc:2881
#4  0x0000559153b1ce85 in Query_result_send::send_data (this=0x746cd8010498, thd=0x746cd8001050, items=...) at /home/yym/mysql8/mysql-8.1.0/sql/query_result.cc:102
#5  0x0000559153513ef0 in Query_expression::ExecuteIteratorQuery (this=0x746cd800db40, thd=0x746cd8001050) at /home/yym/mysql8/mysql-8.1.0/sql/sql_union.cc:1785
#6  0x0000559153514181 in Query_expression::execute (this=0x746cd800db40, thd=0x746cd8001050) at /home/yym/mysql8/mysql-8.1.0/sql/sql_union.cc:1823
#7  0x0000559153454cf6 in Sql_cmd_dml::execute_inner (this=0x746cd8010460, thd=0x746cd8001050) at /home/yym/mysql8/mysql-8.1.0/sql/sql_select.cc:1022
#8  0x0000559153454067 in Sql_cmd_dml::execute (this=0x746cd8010460, thd=0x746cd8001050) at /home/yym/mysql8/mysql-8.1.0/sql/sql_select.cc:793
#9  0x00005591533c6841 in mysql_execute_command (thd=0x746cd8001050, first_level=true) at /home/yym/mysql8/mysql-8.1.0/sql/sql_parse.cc:4797
#10 0x00005591533c8cb3 in dispatch_sql_command (thd=0x746cd8001050, parser_state=0x746de10f79f0) at /home/yym/mysql8/mysql-8.1.0/sql/sql_parse.cc:5447
#11 0x00005591533be0d7 in dispatch_command (thd=0x746cd8001050, com_data=0x746de10f8340, command=COM_QUERY) at /home/yym/mysql8/mysql-8.1.0/sql/sql_parse.cc:2112
#12 0x00005591533bbf77 in do_command (thd=0x746cd8001050) at /home/yym/mysql8/mysql-8.1.0/sql/sql_parse.cc:1459
#13 0x0000559153613835 in handle_connection (arg=0x559198b65f80) at /home/yym/mysql8/mysql-8.1.0/sql/conn_handler/connection_handler_per_thread.cc:303
#14 0x0000559155552bdc in pfs_spawn_thread (arg=0x559198b3ec30) at /home/yym/mysql8/mysql-8.1.0/storage/perfschema/pfs.cc:3043
#15 0x0000746df0e94ac3 in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:442
#16 0x0000746df0f26850 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81

 ##MONTH函数 gdb调试堆栈

#0  Item_func_now::get_date (this=0x746cec01b6d0, res=0x746de13fbbd0) at /home/yym/mysql8/mysql-8.1.0/sql/item_timefunc.cc:2108
#1  0x00005591539bcb6d in Item_func::get_arg0_date (this=0x746cec01b7c8, ltime=0x746de13fbbd0, fuzzy_date=1) at /home/yym/mysql8/mysql-8.1.0/sql/item_func.h:510
#2  0x00005591539b1ea2 in Item_func_month::val_int (this=0x746cec01b7c8) at /home/yym/mysql8/mysql-8.1.0/sql/item_timefunc.cc:1268
#3  0x00005591538f1fe0 in Item_func_mod::int_op (this=0x746cec01b990) at /home/yym/mysql8/mysql-8.1.0/sql/item_func.cc:2585
#4  0x00005591538eda46 in Item_func_numhybrid::val_int (this=0x746cec01b990) at /home/yym/mysql8/mysql-8.1.0/sql/item_func.cc:1740
#5  0x00005591538600cb in Item::send (this=0x746cec01b990, protocol=0x746cec012d80, buffer=0x746de13fbe20) at /home/yym/mysql8/mysql-8.1.0/sql/item.cc:7483
#6  0x00005591532bf8a0 in THD::send_result_set_row (this=0x746cec000b90, row_items=...) at /home/yym/mysql8/mysql-8.1.0/sql/sql_class.cc:2881
#7  0x0000559153b1ce85 in Query_result_send::send_data (this=0x746cec01dba8, thd=0x746cec000b90, items=...) at /home/yym/mysql8/mysql-8.1.0/sql/query_result.cc:102
#8  0x0000559153513ef0 in Query_expression::ExecuteIteratorQuery (this=0x746cec01b250, thd=0x746cec000b90) at /home/yym/mysql8/mysql-8.1.0/sql/sql_union.cc:1785
#9  0x0000559153514181 in Query_expression::execute (this=0x746cec01b250, thd=0x746cec000b90) at /home/yym/mysql8/mysql-8.1.0/sql/sql_union.cc:1823
#10 0x0000559153454cf6 in Sql_cmd_dml::execute_inner (this=0x746cec01db70, thd=0x746cec000b90) at /home/yym/mysql8/mysql-8.1.0/sql/sql_select.cc:1022
#11 0x0000559153454067 in Sql_cmd_dml::execute (this=0x746cec01db70, thd=0x746cec000b90) at /home/yym/mysql8/mysql-8.1.0/sql/sql_select.cc:793
#12 0x00005591533c6841 in mysql_execute_command (thd=0x746cec000b90, first_level=true) at /home/yym/mysql8/mysql-8.1.0/sql/sql_parse.cc:4797
#13 0x00005591533c8cb3 in dispatch_sql_command (thd=0x746cec000b90, parser_state=0x746de13fd9f0) at /home/yym/mysql8/mysql-8.1.0/sql/sql_parse.cc:5447
#14 0x00005591533be0d7 in dispatch_command (thd=0x746cec000b90, com_data=0x746de13fe340, command=COM_QUERY) at /home/yym/mysql8/mysql-8.1.0/sql/sql_parse.cc:2112
#15 0x00005591533bbf77 in do_command (thd=0x746cec000b90) at /home/yym/mysql8/mysql-8.1.0/sql/sql_parse.cc:1459
#16 0x0000559153613835 in handle_connection (arg=0x559198b68010) at /home/yym/mysql8/mysql-8.1.0/sql/conn_handler/connection_handler_per_thread.cc:303
#17 0x0000559155552bdc in pfs_spawn_thread (arg=0x559198b689e0) at /home/yym/mysql8/mysql-8.1.0/storage/perfschema/pfs.cc:3043
#18 0x0000746df0e94ac3 in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:442
#19 0x0000746df0f26850 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

清华大学:DeepSeek与AI幻觉(31页PDF)

PDF深入探讨了AI幻觉的概念、原因、评测方法及其实用应用&#xff0c;特别是在金融领域的具体案例。首先介绍了AI幻觉的定义&#xff0c;主要包括数据偏差、泛化困境、知识固化和意图误解四种情况&#xff0c;以及这些因素导致AI产出不合理结果的原因。随后&#xff0c;通过音乐…

AWS云从业者认证题库 AWS Cloud Practitioner(2.21)

题库持续更新&#xff0c;上方二维码查看完整题库&#xff01; 公司希望减少开发人员用于运行代码的物理计算资源,通过启用无服务器架构&#xff0c;哪种服务可以满足该需求? A&#xff1a; Amazon Elastic Compute Cloud (Amazon EC2) B&#xff1a; AWS Lambda C&#xff1a…

网络工程师 (43)IP数据报

前言 IP数据报是互联网传输控制协议&#xff08;Internet Protocol&#xff0c;IP&#xff09;的数据报格式&#xff0c;由首部和数据两部分组成。 一、首部 IP数据报的首部是控制部分&#xff0c;包含了数据报传输和处理所需的各种信息。首部可以分为固定部分和可变部分。 固定…

京准电钟:水利控制系统网络时间同步设计与应用

京准电钟&#xff1a;水利控制系统网络时间同步设计与应用 京准电钟&#xff1a;水利控制系统网络时间同步设计与应用 引言 在水利工程中&#xff0c;控制系统的高效运行依赖于精准的时间同步。水电站、泵站、闸门控制、水文监测等子系统的协同作业需要毫秒甚至微秒级的时间…

QML 实现一个动态的启动界面

QML 实现一个动态的启动界面 一、效果查看二、源码分享三、所用到的资源下载 一、效果查看 二、源码分享 工程结构 main.qml import QtQuick import QtQuick.Controls import QtQuick.Dialogs import Qt.labs.platformWindow {id:windowwidth: 640height: 400visible: truetit…

【论文阅读】SAM-CP:将SAM与组合提示结合起来的多功能分割

导言 近年来&#xff0c;视觉基础模型的快速发展推动了多模态理解的进步&#xff0c;尤其是在图像分割任务中。例如&#xff0c;Segment Anything模型&#xff08;SAM&#xff09;在图像Mask分割上表现出色&#xff0c;但在语义及实例分割方面仍存在局限。本文提出的SAM-CP&am…

逻辑架构与软件架构在PREEvision中的设计关系

1 Introduction 在如今汽车电子系统的开发过程中&#xff0c;系统架构设计是至关重要的环节。无论是汽车控制系统、信息娱乐系统&#xff0c;还是电动驱动系统&#xff0c;架构设计都决定了整个系统的功能、性能以及后期的可维护性和可扩展性。 在往期文章中&#xff0c;我们…

武汉火影数字|VR沉浸式空间制作 VR大空间打造

VR沉浸式空间制作是指通过虚拟现实技术创建一个逼真的三维环境&#xff0c;让用户能够沉浸在这个环境中&#xff0c;彷佛置身于一个全新的世界。 也许你会好奇&#xff0c;VR 沉浸式空间究竟是如何将我们带入那奇妙的虚拟世界的呢&#xff1f;这背后&#xff0c;离不开一系列关…

大数据学习之任务流调度系统Azkaban、Superset可视化系统

一.任务流调度系统Azkaban 1.课程介绍 2.为什么需要工作流调度系统 3.AZKABAN是什么 4.AZKABAN下载 5.制作安装包 6.tar包准备 7.MYSQL配置AZKABAN 8.配置EXECUTOR SERVER 9.配置WEBSERVER 10.单作业实战_yaml语言(今天稍晚更新) 11.单作业实战 12.多作业依赖实战 13.失败自动重…

在VS-qt的程序中,后期增加PCH预编译功能,提高编译速度

由于前期创建qt程序的时候未勾选pch功能,导致没有启动预编译的功能. 这种情况下需要增加pch功能应该怎么做? 在项目中增加2个文件 stdafx.h和stdafx.cpp文件 stdafx.h增加qt常用头文件 #pragma once //windows #include <windows.h>//qt常用 #include <QObject&g…

蓝桥云客 路径之谜

11.路径之谜 - 蓝桥云课 路径之谜 题目描述 小明冒充X星球的骑士&#xff0c;进入了一个奇怪的城堡。 城堡里边什么都没有&#xff0c;只有方形石头铺成的地面。 假设城堡地面是nn个方格。如下图所示。 按习俗&#xff0c;骑士要从西北角走到东南角。可以横向或纵向移动&…

【Python项目】基于Python的语音数据及标注核对审核系统

【Python项目】基于Python的语音数据及标注核对审核系统 技术简介&#xff1a; 采用Python技术、MySQL数据库、Django框架等实现。 系统简介&#xff1a; 语音数据及标注核对审核系统是一个基于B/S架构的语音数据处理平台&#xff0c;旨在通过自动化的方式对语音数据进行标…

深入解析BFS算法:C++实现无权图最短路径的高效解决方案

在无权图中&#xff0c;广度优先搜索&#xff08;BFS&#xff09;是解决最短路径问题的高效算法。接下来博主从专业角度深入探讨其实现细节&#xff0c;并给出C代码示例&#xff1a; 目录 一、核心原理 二、算法步骤 三、C实现关键点 1. 数据结构 2. 边界检查 3. 路径回溯…

LeetCode刷题---二分查找---441

排列硬币 441. 排列硬币 - 力扣&#xff08;LeetCode&#xff09; 题目 你总共有 n 枚硬币&#xff0c;并计划将它们按阶梯状排列。对于一个由 k 行组成的阶梯&#xff0c;其第 i 行必须正好有 i 枚硬币。阶梯的最后一行 可能 是不完整的。 给你一个数字 n &#xff0c;计算…

Unity结合Vuforia虚拟按键实现AR机械仿真动画效果

零、最终效果 待上传 一、资源准备 1、Vuforia Vuforia版本不能高于10.17.4&#xff08;往上的版本虚拟按键功能被删除&#xff09; 2、Unity Unity版本必须要高于2022.3.x&#xff0c;不然使用Vuforia插件时会出现bug 二、主要内容 1、添加虚拟按钮 2、为虚拟按钮设置…

网络安全 linux学习计划 linux网络安全精要

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 2.使用命令行 文件系统层次标准&#xff08;FHS&#xff09;是一个文件和目录在Unix和Linux操作系统上面应该如何存储的定义。 /bin 重要的二进制可执行程序/bo…

为AI聊天工具添加一个知识系统 之115 详细设计之56 知识表征 之2

本文要点 要点 知识表征的顶级范畴中最好是先将九个原语primitive T, ⊥, Independent, Relative, Mediating, Physical, Abstract, Continuant,和 Occurrent 进行分组&#xff08;分成2大组 和 4个小组&#xff09;并写出它们的满足公司&#xff0c;然后将它们和三种设计&am…

C#初级教程(1)——C# 与.NET 框架:探索微软平台编程的强大组合

图片来源&#xff1a; https://www.lvhang.site/docs/dotnettimeline 即梦AI - 一站式AI创作平台 一、历史发展脉络 在早期的微软平台编程中&#xff0c;常用的编程语言有 Visual Basic、C、C。到了 20 世纪 90 年代末&#xff0c;Win32 API、MFC&#xff08;Microsoft Found…

Mac m1 连接公司内网

1、创建VPN 1、在系统偏好设置 2、选择网络 3、进行添加 2、添加设置 1、选择VPN 2、类型选择L2TP/IPSec 3、填写服务器IP和账号 4、点击认证设置-填写密码 。然后应用 3、进行特殊配置 网上说苹果系统的问题。 1、创建命令 sudo vim /etc/ppp/options 2、添加内容-主要别…

C++:类与对象,定义类和构造函数

#define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> using namespace std; //如何让定义一个类 // 封装 // 1、将数据和方法定义到一起。 // 2、把想给你看的数据给你看&#xff0c;不想给你看的封装起来。 通过访问限定符来实现 class Stack { public: //1.成…