Hi everyone,
thanks for the various feedback and lively discussion. Sorry, for the
late reply as I was on vacation. Let me answer to some of the topics:
1) Systems columns should not be shown with DESCRIBE statements
This sounds fine to me. I will update the FLIP in the next iteration.
2) Do you know why most SQL systems do not need any prefix with their
pseudo column?
Because most systems do not have external catalogs or connectors. And
also the number of system columns is limited to a handful of columns.
Flink is more generic and thus more complex. And we have already the
concepts of metadata columns. We need to be careful with not overloading
our language.
3) Implementation details
> how to you plan to implement the "system columns", do we need to add
it to `RelNode` level? Or we just need to do it in the
parsing/validating phase?
> I'm not sure that Calcite's "system column" feature is fully ready
My plan would be to only modify the parsing/validating phase. I would
like to avoid additional complexity in planner rules and
connector/catalog interfaces. Metadata columns already support
projection push down and are passed through the stack (via Schema,
ResolvedSchema, SupportsReadableMetadata). Calcite's "system column"
feature is not fully ready yet and it would be a large effort
potentially introducing bugs in supporting it. Thus, I'm proposing to
leverage what we already have. The only part that needs to be modified
is the "expand star" method in SqlValidator and Table API.
Queries such as `SELECT * FROM (SELECT $rowtime, * FROM t);` would show
$rowtime as the expand star has only a special case when in the scope
for `FROM t`. All further subqueries treat it as a regular column.
4) Built-in defined pseudo-column "$rowtime"
> Did you consider making it as a built-in defined pseudo-column
"$rowtime" which returns the time attribute value (if exists) or null
(if non-exists) for every table/query, and pseudo-column "$proctime"
always returns PROCTIME() value for each table/query
Built-in pseudo-columns mean that connector or catalog providers need
consensus in Flink which pseudo-columns should be built-in. We should
keep the concept generic and let platform providers decide which pseudo
columns to expose. $rowtime might be obvious but others such as
$partition or $offset are tricky to get consensus as every external
connector works differently. Also a connector might want to expose
different time semantics (such as ingestion time).
5) Any operator can introduce system (psedo) columns.
This is clearly out of scope for this FLIP. The implementation effort
would be huge and could introduce a lot of bugs.
6) "Metadata Key Prefix Constraint" which is still a little complex
Another option could be to drop the naming pattern constraint. We could
make it configurable that METADATA VIRTUAL columns are never selected by
default in SELECT * or visible in DESCRIBE. This would further simplify
the FLIP and esp lower the impact on the planner and all interfaces.
What do you think about this? We could introduce a flag:
table.expand-metadata-columns (better name to be defined)
This way we don't need to introduce the concept of system columns yet,
but can still offer similar functionality with minimal overhead in the
code base.
Regards,
Timo
On 04.08.23 23:06, Alexey Leonov-Vendrovskiy wrote:
Looks like both kinds of system columns can converge.
We can say that any operator can introduce system (psedo) columns.
cc Eugene who is also interested in the subject.
On Wed, Aug 2, 2023 at 1:03 AM Paul Lam <paullin3...@gmail.com> wrote:
Hi Timo,
Thanks for starting the discussion! System columns are no doubt a
good boost on Flink SQL’s usability, and I see the feedbacks are
mainly concerns about the accessibility of system columns.
I think most of the concerns could be solved by clarifying the
ownership of the system columns. Different from databases like
Oracle/BigQuery/PG who owns the data/metadata, Flink uses the
data/metadata from external systems. That means Flink could
have 2 kinds of system columns (take ROWID for example):
1. system columns provided by external systems via catalogs, such
as ROWID from the original system.
2. system columns generated by Flink, such as ROWID generated by
Flink itself.
IIUC, the FLIP is proposing the 1st approach: the catalog defines what
system columns to provide, and Flink treats them as normal columns
with a special naming pattern.
On the other hand, Jark is proposing the 2nd one: the system columns
are defined and owned by Flink, and can be inferred from external
systems. Therefore, system columns should be predefined by Flink,
and optionally implemented by the catalogs.
Personally, I’m in favor of the 2nd approach, because it makes the
system columns very accessible and more aligned across the catalogs.
BTW, I second Alexey that systems columns should not be shown with
DESCRIBE statements.
WDYT? Thanks!
Best,
Paul Lam
2023年7月31日 23:54,Jark Wu <imj...@gmail.com> 写道:
Hi Timo,
Thanks for your proposal. I think this is a nice feature for users and I
prefer option 3.
I only have one concern about the concept of pseudo-column or
system-column,
because this is the first time we introduce it in Flink SQL. The
confusion is similar to the
question of Benchao and Sergey about the propagation of pseudo-column.
From my understanding, a pseudo-column can be get from an arbitrary
query,
just similar to
ROWNUM in Oracle[1], such as :
SELECT *
FROM (SELECT * FROM employees ORDER BY employee_id)
WHERE ROWNUM < 11;
However, IIUC, the proposed "$rowtime" pseudo-column can only be got from
the physical table
and can't be got from queries even if the query propagates the rowtime
attribute. There was also
a discussion about adding a pseudo-column "_proctime" [2] to make lookup
join easier to use
which can be got from arbitrary queries. That "_proctime" may conflict
with
the proposed
pseudo-column concept.
Did you consider making it as a built-in defined pseudo-column "$rowtime"
which returns the
time attribute value (if exists) or null (if non-exists) for every
table/query, and pseudo-column
"$proctime" always returns PROCTIME() value for each table/query. In this
way, catalogs only need
to provide a default rowtime attribute and users can get it in the same
way. And we don't need
to introduce the contract interface of "Metadata Key Prefix Constraint"
which is still a little complex
for users and devs to understand.
Best,
Jark
[1]:
https://docs.oracle.com/cd/E11882_01/server.112/e41084/pseudocolumns009.htm#SQLRF00255
[2]: https://lists.apache.org/thread/7ln106qxyw8sp7ljq40hs2p1lb1gdwj5
On Fri, 28 Jul 2023 at 06:18, Alexey Leonov-Vendrovskiy <
vendrov...@gmail.com> wrote:
`SELECT * FROM (SELECT $rowtime, * FROM t);`
Am I right that it will show `$rowtime` in output ?
Yes, all explicitly selected columns become a part of the result (and
intermediate) schema, and hence propagate.
On Thu, Jul 27, 2023 at 2:40 PM Alexey Leonov-Vendrovskiy <
vendrov...@gmail.com> wrote:
Thank you, Timo, for starting this FLIP!
I propose the following change:
Remove the requirement that DESCRIBE need to show system columns.
Some concrete vendor specific catalog implementations might prefer this
approach.
Usually the same system columns are available on all (or family) of
tables, and it can be easily captured in the documentation.
For example, BigQuery does exactly this: there, pseudo-columns do not
show
up in the table schema in any place, but can be accessed via reference.
So I propose we:
a) Either we say that DESCRIBE doesn't show system columns,
b) Or leave this vendor-specific / or configurable via flag (if
needed).
Regards,
Alexey
On Thu, Jul 27, 2023 at 3:27 AM Sergey Nuyanzin <snuyan...@gmail.com>
wrote:
Hi Timo,
Thanks for the FLIP.
I also tend to think that Option 3 is better.
I would be also interested in a question mentioned by Benchao Li.
And a similar question about nested queries like
`SELECT * FROM (SELECT $rowtime, * FROM t);`
Am I right that it will show `$rowtime` in output ?
On Thu, Jul 27, 2023 at 6:58 AM Benchao Li <libenc...@apache.org>
wrote:
Hi Timo,
Thanks for the FLIP, I also like the idea and option 3 sounds good to
me.
I would like to discuss a case which is not mentioned in the current
FLIP.
How are the "System column"s expressed in intermediate result, e.g.
Join?
E.g. `SELECT * FROM t1 JOIN t2`, I guess it should not include
"system
columns" from t1 and t2 as you proposed, and for `SELECT t1.$rowtime,
*
FROM t1 JOIN t2`, it should also be valid.
Then the question is how to you plan to implement the "system
columns",
do
we need to add it to `RelNode` level? Or we just need to do it in the
parsing/validating phase?
I'm not sure that Calcite's "system column" feature is fully ready
for
this
since the code about this part is imported from the earlier project
before
it gets into Apache, and has not been considered much in the past
development.
Jing Ge <j...@ververica.com.invalid> 于2023年7月26日周三 00:01写道:
Hi Timo,
Thanks for your proposal. It is a very pragmatic feature. Among all
options
in the FLIP, option 3 is one I prefer too and I'd like to ask some
questions to understand your thoughts.
1. I did some research on pseudo columns, just out of curiosity, do
you
know why most SQL systems do not need any prefix with their pseudo
column?
2. Some platform providers will use ${variable_name} to define their
own
configurations and allow them to be embedded into SQL scripts. Will
there
be any conflict with option 3?
Best regards,
Jing
On Tue, Jul 25, 2023 at 7:00 PM Konstantin Knauf <kna...@apache.org
wrote:
Hi Timo,
this makes sense to me. Option 3 seems reasonable, too.
Cheers,
Konstantin
Am Di., 25. Juli 2023 um 12:53 Uhr schrieb Timo Walther <
twal...@apache.org
:
Hi everyone,
I would like to start a discussion about introducing the concept
of
"System Columns" in SQL and Table API.
The subject sounds bigger than it actually is. Luckily, Flink
SQL
already exposes the concept of metadata columns. And this
proposal is
just a slight adjustment for how metadata columns can be used as
system
columns.
The biggest problem of metadata columns currently is that a
catalog
implementation can't provide them by default because they would
affect
`SELECT *` when adding another one.
Looking forward to your feedback on FLIP-348:
https://cwiki.apache.org/confluence/display/FLINK/FLIP-348%3A+Support+System+Columns+in+SQL+and+Table+API
Thanks,
Timo
--
https://twitter.com/snntrable
https://github.com/knaufk
--
Best,
Benchao Li
--
Best regards,
Sergey