More `function_list` pragma information
(1) By anonymous on 2021-01-04 10:52:47 [link] [source]
Hi. https://www.sqlite.org/pragma.html#pragma_function_list does not describe
the format of the table, or the meaning of the columns. Is it documented elsewhere?
In my particular SQLite GUI tool of choice, I see 189 s
functions, 26 w
ones, and 3 a
ones.
I guess s
is for scalar, w
for window, and a
for aggregate, right? But what distinguishes a
from w
?
Which API is used to register it I guess?
What about the flags
column? I see large numbers like 2099200 and 2097152.
Is https://www.sqlite.org/c3ref/c_deterministic.html an exhaustive list of these flags?
Also, how to know when this pragma was added and/or updated?
I see different columns in different software (or none at all).
(2) By Keith Medcalf (kmedcalf) on 2021-01-04 11:19:12 in reply to 1 [link] [source]
In my particular SQLite GUI tool of choice, I see 189 s functions, 26 w ones, and 3 a ones. I guess s is for scalar, w for window, and a for aggregate, right? But what distinguishes a from w? Which API is used to register it I guess?
Yes and Yes.
The difference between an aggregate function and a window function is that an aggregate function can be used only in aggregate expressions, whereas a window function can be used in either aggregate expressions or window expressions.
An aggregate function only aggregates forward. A window function knows how to remove prior values from the aggregate.
(3) By Gunter Hick (gunter_hick) on 2021-01-04 11:27:03 in reply to 1 [link] [source]
see https://sqlite.org/changes.html
function_list was made available by default in 3.30.0 and the output format was update in 3.31.0
The flags column also includes the "preferred text encoding"
(4) By anonymous on 2021-01-04 11:57:22 in reply to 3 [link] [source]
Thanks.
Yeah, I missed the https://www.sqlite.org/c3ref/c_any.html flags for preferred text encoding.
Although I suspect that's what the encoding
column might correspond to.
Especially since those encoding values are not bit flags, but 1, 2, 3, 4, 5.
But I guess my main point remain, is that more official doc would be great.
This thread won't be easily found by others pondering the same questions.
Here's a query with flags as individual boolean columns:
select name
, case type
when 's' then 'scalar'
when 'w' then 'aggregate'
when 'a' then 'window'
end as "type"
, narg as "arg-count"
, enc as "preferred-text-encoding"
, (flags & 0x000000800)!=0 as "deterministic"
, (flags & 0x000080000)!=0 as "directonly"
, (flags & 0x000100000)!=0 as "subtype"
, (flags & 0x000200000)!=0 as "innocuous"
from pragma_function_list
And here's another query with flags as a single text column:
select name
, case type
when 's' then 'scalar'
when 'w' then 'aggregate'
when 'a' then 'window'
end as "type"
, narg as "arg-count"
, enc as "preferred-text-encoding"
, ( select group_concat(f, ' | ') from
( select case when (flags & 0x000000800)!=0 then 'deterministic' end as f
union all
select case when (flags & 0x000080000)!=0 then 'directonly' end as f
union all
select case when (flags & 0x000100000)!=0 then 'subtype' end as f
union all
select case when (flags & 0x000200000)!=0 then 'innocuous' end as f
)
) as "flags"
from pragma_function_list
(I'm sure there's a better way to write that last query)
(5) By anonymous on 2021-05-10 15:10:52 in reply to 4 [link] [source]
???
when 's' then 'scalar' when 'w' then 'aggregate' when 'a' then 'window'
Should that not be:
when 's' then 'scalar' when 'a' then 'aggregate' when 'w' then 'window'
(6) By ddevienne on 2023-01-09 08:36:11 in reply to 4 [source]
Here's a variation that incorporates the above fix, adds builtin
, and makes a (sorted) view of it.
Still ignores encoding-related flags pointed out by Gunter, in favor of the enc
column.
(There might be other flags, who knows. I'll try to update this if/when they crop up)
create view v$function_list as
select name, builtin
, case type
when 's' then 'scalar'
when 'w' then 'window'
when 'a' then 'aggregate'
end as "type"
, narg as "arg-count"
, enc as "preferred-text-encoding"
, ( select group_concat(f, ' | ') from
( select case when (flags & 0x000000800)!=0 then 'deterministic' end as f
union all
select case when (flags & 0x000080000)!=0 then 'direct-only' end as f
union all
select case when (flags & 0x000100000)!=0 then 'subtype' end as f
union all
select case when (flags & 0x000200000)!=0 then 'innocuous' end as f
)
) as "flags"
from pragma_function_list
order by name, narg