...
This FLIP propose to disable the cast between numeric and timestamp, and proposed use current function TO_TIMESTAMP(FROM_UNIXTIMESTAMPUNIXTIME(epochSeconds - zoneoffset)) as a migration plan.
function | current behavior | existed problem | migration plan |
CAST(44 AS TIMESTAMP) | TIMESTAMP(0) NOT NULL #session timezone: UTC 1970-01-01 00:00:44 #session timezone: UTC+8 1970-01-01 00:00:44 | The time in BIGINT type usually represents a unixtime semantic, which represents the elapsed time since java epoch(1970-01-01 00:00:00 UTC+0), when convert to a timestamp we should consider local time zone | This is an invalid behavior, disable the invalid CAST behavior, to get same behavior, user can workaround with: #session timezone: UTC
1970-01-01 00:00:44 #session timezone: UTC+8 TO_TIMESTAMP(FROM_UNIXTIMESTAMPUNIXTIME(44 - 8 * 60 * 60)) 1970-01-01 00:00:44 |
CAST(TIMESTAMP ‘1970-01-01 00:00:44’ AS BIGINT) | BIGINT NOT NULL #session timezone: UTC 44 #session timezone: UTC+8 44 | The inverse conversion of above, this conversion is used rarely. | UNIX_TIMESTAMP(TIMESTAMP ‘1970-01-01 00:00:44’) #session timezone: UTC 44 #session timezone: UTC+8 -28756 |
...
Due to the historical reason, we didn't not support TIME(9) yet, we think It's a good time point to support it in this FLIP.
8. Introduce 'table.exec.time-function-evaluation' config to control when the time function should be evaluated.
an option table.exec.time-function-evaluation to control the materialize time point of time function value. The time function includes
- LOCALTIME
- LOCALTIMESTAMP
- CURRENT_DATE
- CURRENT_TIME
- CURRENT_TIMESTAMP
- NOW()
The default value of table.exec.time-function-evaluation includes 'auto', 'per-record', 'query-start'.
- 'auto', the default value which means Flink evaluates above time function values according to execution mode, i.e. Flink evaluates time function value for per record in Streaming mode, evaluates the time function value at query start for batch mode.
- 'per-record', Flink evaluates time function value for per record.
- 'query-start', Flink evaluate above time function value at query-start, the time function always returns same value in a query.
General Implementations
1.Change the codegen implementations for above five functions/cast conversions according to the value of introduced table option: table.exec.fallback-legacy-time-function
...