ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

StarRocks ceil 函数详解:从 SQL 语义、返回值类型到 FE/BE 源码实现

StarRocks ceil 函数详解:从 SQL 语义、返回值类型到 FE/BE 源码实现 StarRocks ceil 函数详解从 SQL 语义、返回值类型到 FE/BE 源码实现【免费下载链接】starrocksThe worlds fastest open query engine for sub-second analytics both on and off the data lakehouse. With the flexibility to support nearly any scenario, StarRocks provides best-in-class performance for multi-dimensional analytics, real-time analytics, and ad-hoc queries. A Linux Foundation project.项目地址: https://gitcode.com/GitHub_Trending/st/starrocksStarRocks 提供ceil又称dceil、ceiling数学函数用于将输入值向上取整——返回大于或等于输入参数的最小整数。本文基于官方文档 ceil, dceil 的完整语义说明结合 StarRocks 仓库中 FE 解析层与 BE 表达式层的源码逐层拆解该函数的类型约定、底层调用链与边界行为帮助你在容量计算、资源分配等“按整向上取整”的场景中准确使用它。函数语义ceil(arg)返回大于或等于输入arg的最小整数即数学上的“上取整”ceiling正数小数被舍入到下一个更大的整数例如ceil(3.14)返回4负数小数则向零方向取整因为要满足“不小于输入”例如ceil(-3.9)返回-3输入本身是整数时原样返回。这一点与向下取整的floor、四舍五入的round形成互补三者共同覆盖常见的取整需求。语法ceil(arg)ceil是 StarRocks 的非保留关键字也可以以CEIL(...)大写形式书写在函数名常量层面StarRocks 同时登记了ceil、dceil两种拼写见下文源码分析另有 SQL 标准别名ceiling与之等价。参数与返回值项目说明参数arg支持DOUBLE数据类型返回值BIGINT类型返回值类型是BIGINT而非DOUBLE这是 StarRocksceil与部分其他数据库的差异点之一调用方得到的结果可直接参与整数运算无需再做隐式转换。由于输入域是DOUBLE、输出域是BIGINT当arg为NULL时返回NULL当arg为 NaN 时BE 层带有输出校验逻辑见下文从源码结构看会返回 NULL 而非产生未定义结果。示例官方文档给出的示例如下mysql select ceil(3.14); ------------ | ceil(3.14) | ------------ | 4 | ------------ 1 row in set (0.15 sec)在文档示例的基础上结合“BIGINT 返回”和“向上取整”两条语义可以补充理解几类典型输入SELECT ceil(3.14); -- 4正数小数进位到下一个整数 SELECT ceil(-3.14); -- -3负数方向是“不小于输入的最小整数” SELECT ceil(4.0); -- 4输入为整数时原样返回 SELECT ceil(NULL); -- NULL空值输入直接透传FE 侧关键字解析与函数名登记CEIL 作为非保留关键字被解析为函数调用在 FE 的 ANTLR 解析器中CEIL被声明为关键字并在表达式上下文中直接构造函数调用节点。见 AstBuilder.java} else if (context.FLOOR() ! null) { return new FunctionCallExpr(floor, visit(context.expression(), Expr.class), pos); } else if (context.CEIL() ! null) { return new FunctionCallExpr(ceil, visit(context.expression(), Expr.class), pos); }这意味着CEIL(3.14)无需加引号或反引号解析器会将其归一为小写的ceil函数调用随后进入常规的函数签名匹配流程。函数名常量ceil / dceil / ceiling 并存FE 侧的函数名常量集中定义在 FunctionSet.javapublic static final String CEIL ceil; public static final String DCEIL dceil; public static final String CEILING ceiling;从常量定义可以看出dceil文档标题中列出的双字母别名与ceilingSQL 标准别名都在函数名体系内登记。优化器统计模块对 ceil 的特殊处理在基于直方图/统计信息的表达式估计中ceil与floor、round等取整类函数被放在同一分支处理。见 ExpressionStatisticCalculator.javacase FunctionSet.FLOOR: case FunctionSet.DFLOOR: case FunctionSet.CEIL: case FunctionSet.CEILING: case FunctionSet.ROUND: case FunctionSet.DROUND: case FunctionSet.TRUNCATE:这表明优化器在为谓词选择率做统计估计时会按“单参数确定性变换”的思路处理ceil类函数而不是走通用的表达式回退路径。延伸用法time_slice / date_slice 的边界参数CEIL关键字在 StarRocks 中还有一个与取整函数直接相关的复用场景time_slice/date_slice允许把FLOOR或CEIL作为边界参数控制时间片对齐方式。见 AstBuilder.java// time_slice / date_slice accept FLOOR or CEIL (case-insensitive) as their // boundary argument, e.g. time_slice(dt, interval 5 minute, FLOOR). private static String getTimeSliceBoundary(ParseNode boundaryArg, String functionName) { if (boundaryArg instanceof SlotRef) { ... if (boundary.equals(TIME_SLICE_BOUNDARY_FLOOR) || boundary.equals(TIME_SLICE_BOUNDARY_CEIL)) { return boundary; } } ... }由于FLOOR/CEIL是非保留关键字解析器会把裸关键字构造成列引用SlotRef解析层再把它归一为小写字符串ceil交给函数实现——注释中的例子time_slice(dt, interval 5 minute, FLOOR)展示了完整形态把FLOOR换成CEIL即实现向上对齐到时间片边界。BE 侧表达式函数的注册与实现BEBackend侧的ceil实现在数学函数集中注册见 math_functions.cppDEFINE_MATH_UNARY_WITH_OUTPUT_NAN_CHECK_FN_WITH_IMPL(ceil, TYPE_DOUBLE, TYPE_BIGINT, std::ceil); DEFINE_MATH_UNARY_WITH_OUTPUT_NAN_CHECK_FN_WITH_IMPL(floor, TYPE_DOUBLE, TYPE_BIGINT, std::floor);从这一行注册宏可以读出四个实现事实函数体直接映射到 C 标准库std::ceil行为遵循 IEEE 754 的上取整语义无额外算法开销输入类型为TYPE_DOUBLE、输出类型为TYPE_BIGINT与文档“参数支持 DOUBLE、返回 BIGINT”完全一致类型约定在表达式求值前已由类型系统保证宏名中的OUTPUT_NAN_CHECK表示结果带输出校验从源码结构看当输入为 NaN 或计算结果非法时函数会返回 NULL 而不是把 NaN 强转成整数这解释了 NULL/NaN 输入下的安全行为ceil与floor相邻注册、共享同一宏模板二者仅差std::ceil/std::floor一个函数指针维护上是对称的。同文件中的取整相关实现如double_round内部的std::ceil调用见 math_functions.cpp也表明StarRocks 内部其他取整逻辑truncate、round_up_to等同样复用std::ceil作为基础构件ceil是整个取整函数族的底层算子之一。小结与使用建议ceil(arg)将DOUBLE输入向上取整返回BIGINTdceil、ceiling是等价函数名CEIL作为非保留关键字可直接书写语义要记牢“不小于输入的最小整数”负数场景下ceil(-3.14)得到-3而不是-4NULL与 NaN 输入不会产生未定义结果BE 层的输出校验会把 NaN 情况收敛为 NULL典型场景存储/分片/并发容量等“按整向上取整”的计算ceil(rows / partition_size)、与time_slice的CEIL边界配合做向上对齐的时间分桶与floor/round的选择三者返回类型一致均为整数语义按业务对“余数归属”的要求选用即可。相关参考文件官方文档英文、官方文档中文、BE 数学函数实现、FE 函数名常量、FE 解析器。【免费下载链接】starrocksThe worlds fastest open query engine for sub-second analytics both on and off the data lakehouse. With the flexibility to support nearly any scenario, StarRocks provides best-in-class performance for multi-dimensional analytics, real-time analytics, and ad-hoc queries. A Linux Foundation project.项目地址: https://gitcode.com/GitHub_Trending/st/starrocks创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表