实现 generate_series 函数
- 按照参数输出序列
-
null in null out,有任何参数为null,则输出null
-
2 个参数,则从 start 到 end 输出,数值类型步长为1,时间类型不接受两个参数,必须指定步长,那个参数在前面,就使用那个参数的类型
-
3 个参数,则从 start 到 end 输出,步长为 step,时间类型步长为 step,输出类型为所有参数的公共类型
-
step 可以指定为负,此时输出序列为倒序
-
test 使用 duckdb 和 pg
-
多次调用时候,函数状态
- MySQL 有那些函数是有状态的函数
-
参数为表达式
- 嵌套复杂表达式
- 子查询
-
返回的是 record ,类似表的形式
- 函数一般返回一行,或者一个值
- pg 使用的是 Function Scan 调用,
- MySQL 对应的是什么
- MySQL 怎么把函数作为一个表
- 函数一般返回一行,或者一个值
-
MySQL 不允许 select * from fun(), 只能 select func,func 不能出现在表的位置
- 能出现在表的位置的
-
社区可能不是不想做, 而是前置要求多
-
# non-persistent series generator
{ oid => '1066', proname => 'generate_series', prorows => '1000', prosupport => 'generate_series_int4_support', proretset => 't', prorettype => 'int4', proargtypes => 'int4 int4 int4', prosrc => 'generate_series_step_int4' },
{ oid => '1067', proname => 'generate_series', prorows => '1000', prosupport => 'generate_series_int4_support', proretset => 't', prorettype => 'int4', proargtypes => 'int4 int4', prosrc => 'generate_series_int4' },
{ oid => '3994', proname => 'generate_series_int4_support', prorettype => 'internal', proargtypes => 'internal', prosrc => 'generate_series_int4_support' },
{ oid => '1068', proname => 'generate_series', prorows => '1000', prosupport => 'generate_series_int8_support', proretset => 't', prorettype => 'int8', proargtypes => 'int8 int8 int8', prosrc => 'generate_series_step_int8' },
{ oid => '1069', proname => 'generate_series', prorows => '1000', prosupport => 'generate_series_int8_support', proretset => 't', prorettype => 'int8', proargtypes => 'int8 int8', prosrc => 'generate_series_int8' },
{ oid => '3995', proname => 'generate_series_int8_support', prorettype => 'internal', proargtypes => 'internal', prosrc => 'generate_series_int8_support' },
{ oid => '3259', proname => 'generate_series', prorows => '1000', proretset => 't', prorettype => 'numeric', proargtypes => 'numeric numeric numeric', prosrc => 'generate_series_step_numeric' },
{ oid => '3260', proname => 'generate_series', prorows => '1000', proretset => 't', prorettype => 'numeric', proargtypes => 'numeric numeric', prosrc => 'generate_series_numeric' },
{ oid => '938', proname => 'generate_series', prorows => '1000', proretset => 't', prorettype => 'timestamp', proargtypes => 'timestamp timestamp interval', prosrc => 'generate_series_timestamp' },
{ oid => '939', proname => 'generate_series', prorows => '1000', proretset => 't', provolatile => 's', prorettype => 'timestamptz', proargtypes => 'timestamptz timestamptz interval', prosrc => 'generate_series_timestamptz' },
{ oid => '6274', proname => 'generate_series', prorows => '1000', proretset => 't', prorettype => 'timestamptz', proargtypes => 'timestamptz timestamptz interval text', prosrc => 'generate_series_timestamptz_at_zone' },