Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

实现 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' },