暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【手写数据库核心揭秘系列】第85讲 构建数据类型的代数系统,算述运算符的实现

开源无限 2025-04-18
83

💻 深耕数据库内核架构设计与开发十余年,曾主导多款高性能分布式数据库内核研发,攻克高并发、低延迟等核心技术难题。现倾力打造《从零手写数据库》系列教程,首次系统性公开数据库内核源码级实现细节!

🚀 从存储引擎、查询优化到分布式事务,手把手拆解核心模块;从语法解析树构建到执行计划生成,逐行代码还原设计精髓
🌟 无论你是数据库开发者、系统架构师,还是对底层技术充满好奇的极客,这里都有你想要的“硬核干货”!点击关注,与行业老兵共同探索数据库技术的星辰大海!

一、概述 


算术运算主要是数值类型支持,比如整型,浮点类型,其它类型不支持。

二、整型 


整型数据类型支持所有的算术运算操作:取负、加法、减法、乘法、除法和取模运算。

DataTypeProcs integerDataTypeProcEntry =
{
    DATATYPEPROC_VERSION,
    DT_INTEGER,
    {
        NULL,
        int32NegtiveOperator,
        int32PlusOperator,
        int32MinusOperator,
        int32MultiOperator,
        int32DivisionOperator,
        int32ModOperator,
    }   
};

其中以加法运算操作函数为例,左右操作数传入之后,根据类型取出它实际的数值,再进行运算,最后再包装为结果数据结构。

ValuesData* int32PlusOperator(ValuesData* leftvalue, ValuesData* rightvalue)
{
    int l = leftvalue->dataVal.iData;
    int r = rightvalue->dataVal.iData;
    ValuesData *res = NULL;

    if(rightvalue->dataType != DT_INTEGER)
    {
        printf("Operation is not support between different types(%d-%d).\n", leftvalue->dataType, rightvalue->dataType);
        returnNULL;
    }

    l = l + r;
    res = GetSimpleValueData(leftvalue->dataType, &l);
    return res;
}

三、浮点类型 


浮点数类型支持取负、加法、减法以及乘除算术运算。

DataTypeProcs FloatDataTypeProcEntry =
{
    DATATYPEPROC_VERSION,
    DT_FLOAT,
    {
        NULL,
        floatNegtiveOperator,
        floatPlusOperator,
        floatMinusOperator,
        floatMultiOperator,
        floatDivisionOperator,
    }   
};

这里的算术运算,更多依赖于基础类型的运算,并没有对异常情况过多的处理。这里以浮点数据的减法运算为例,得到两个操作数后直接进行减法运算,再将结果包装为含有类型信息的结构之后返回。

ValuesData* floatMinusOperator(ValuesData* leftvalue, ValuesData* rightvalue)
{
    float first = leftvalue->dataVal.fData;
    float seconde = rightvalue->dataVal.fData;
    ValuesData *res = NULL;

    first = first - seconde;
    res = GetSimpleValueData(leftvalue->dataType, &first);
    return res;
}

 四、总结 


新增表达式模块,对应的代码位于exam_49目录的expr.h/expr.c文件当中。

🌟 点赞收藏,分享给身边的技术伙伴,关注我们,持续获取数据库内核开发的硬核干货!一起从源码级实现到分布式架构,解锁数据库技术的每一个核心细节!🚀
【往期精彩推荐】
【手写数据库核心揭秘系列】第84讲 表达式的运算,表达式类型与实现框架
【手写数据库核心揭秘系列】83 查询执行器,表数据查询展示
【手写数据库核心揭秘系列】81 别名查询,相同数据表却成为不同的数据源表

文章转载自开源无限,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论