Re: Since '2001-09-09 01:46:40'::timestamp microseconds are lost when extracting epoch
Tom Lane <tgl@sss.pgh.pa.us>
From: Tom Lane <tgl@sss.pgh.pa.us>
To: Peter Eisentraut <peter.eisentraut@2ndquadrant.com>
Cc: Vik Fearing <vik@postgresfriends.org>,
Thomas Munro <thomas.munro@gmail.com>,
Petr Fedorov <petr.fedorov@phystech.edu>,
pgsql-hackers <pgsql-hackers@postgresql.org>
Date: 2020-10-31T23:57:23Z
Lists: pgsql-bugs, pgsql-hackers
Attachments
- reverse-list-special-sql-syntaxes-1.patch (text/x-diff) patch
I wrote: > However: suppose that we continue to translate these things into FuncExpr > nodes, the same as always, but we add a new CoercionForm variant, say > COERCE_SQL_SYNTAX. 99% of the system ignores FuncExpr.funcformat, > and would continue to do so, but ruleutils.c would take it to mean > that (1) the call should be reverse-listed as some special SQL syntax > and (2) the funcid is one of a small set of built-in functions for > which ruleutils.c knows what to emit. (If it doesn't recognize the > funcid, it could either throw an error, or fall back to normal display > of the node.) For cases such as EXTRACT, this would also represent > a promise that specific arguments are Const nodes from which the > desired keyword can be extracted. Attached is a draft patch that does this. I'm fairly pleased with it, but there are some loose ends as described below. As the patch stands, it reverse-lists all our special-format function call syntaxes *except* EXTRACT. I left that out since I think we want to apply the reverse-listing change when we add the numeric-output extraction functions, as I said upthread. The main thing that's incomplete here is that the switch on function OID fails to cover some cases that ought to be covered, as a result of limitations of Gen_fmgrtab.pl: * Some C functions such as text_substr have multiple pg_proc entries, and Gen_fmgrtab.pl chooses the wrong one for our purpose. We could either invent new Gen_fmgrtab.pl behavior to allow having macros for all the pg_proc entries, or we could add duplicate C functions so that the pg_proc entries can point to different C symbols. * Some of the functions we need to reference aren't C functions at all, but SQL functions, for instance OID 1305 is defined as select ($1, ($1 + $2)) overlaps ($3, ($3 + $4)) I think our best bet here is to replace these SQL definitions with C equivalents, because really this implementation is pretty sucky. Even if we manage to inline the SQL definition, that's expensive to do; and evaluating some of the arguments twice is not nice either. > This is kind of an abuse of "CoercionForm", since that typedef name > implies that it only talks about how to handle cast cases, but > semantically it's always been a how-to-display-function-calls thing. > We could either hold our noses about that or rename the typedef. I did nothing about that here, since it'd bloat the patch without making anything but cosmetic changes. I'm tempted to propose though that we rename "CoercionForm" to "DisplayForm" and rename its COERCE_XXX values to DISPLAY_XXX, to make this less confusing. Another bit of follow-up work we could contemplate is to get rid of the SQLValueFunction node type, since there's nothing it does that we couldn't do with regular FuncExpr nodes and COERCE_SQL_SYNTAX. But that's just cleanup, and I don't think it would save a very large amount of code. Thoughts? regards, tom lane
Commits
-
Fix inconsistent equalfuncs.c behavior for FuncCall.funcformat.
- a65e9f3f1405 14.0 landed
-
Doc: fix discussion of how to get real Julian Dates.
- f6171e6843f0 9.6.22 landed
- c93f8f3b8d3b 14.0 landed
- 824df1cccb74 12.7 landed
- 7cd542023056 11.12 landed
- 7bbcfb4d584d 13.3 landed
- 56e234b6aff9 10.17 landed
-
Doc: document EXTRACT(JULIAN ...), improve Julian Date explanation.
- ec5bab9217cd 13.3 landed
- b391db4943dc 9.6.22 landed
- b230618ce875 12.7 landed
- 79a5928ebcb7 14.0 landed
- 64d617de3c59 10.17 landed
- 4b610547c27a 11.12 landed
-
Change return type of EXTRACT to numeric
- a2da77cdb466 14.0 landed
-
Improve our ability to regurgitate SQL-syntax function calls.
- 40c24bfef925 14.0 landed
-
Add more tests for EXTRACT of date type
- 540612fa469e 14.0 landed
-
Expose internal function for converting int64 to numeric
- 0aa8f764088e 14.0 landed
-
Change floating-point output format for improved performance.
- 02ddd499322a 12.0 cited