morningman opened a new pull request, #70560:
URL: https://github.com/apache/doris/pull/70560

   ### Background
   
   Since #61382, a table stream (`CREATE STREAM s ON TABLE t`) is listed with 
the tables and views of its database in `SHOW FULL TABLES` and 
`information_schema.tables`, with `ENGINE` `Stream`. Incremental refresh 
(#62606) creates one for each base table of an incrementally refreshed 
materialized view, named `__doris_ivm_stream_<mv id>_<hash>`. 
`TableIf.TableType.toMysqlType` gives a stream the table type `VIEW`.
   
   ### What problem does this PR solve?
   
   Issue Number: None
   
   Related PR: #61382, #62606
   
   PR Type: Enhancement
   
   Problem Summary: Metadata clients take a `VIEW` row for a view: they read 
its definition and parse it for lineage. A stream has no view definition; `SHOW 
CREATE TABLE` prints `CREATE STREAM ... ON TABLE ...`. OpenMetadata, for one, 
ingests every stream as a view whose definition is that statement, and the 
streams incremental refresh creates appear as views nobody created. This PR 
lists a stream as `BASE TABLE`: it is read with SELECT like a table, and MySQL 
defines no other table type that fits. `ENGINE` stays `Stream`, so clients can 
still tell streams apart. Table streams and incremental refresh are only on 
master, so no released version changes its output.
   
   ### Details
   
   - **Before and after:**
   
     | | Before | After |
     |---|---|---|
     | `Table_type` of a stream in `SHOW FULL TABLES` | `VIEW` | `BASE TABLE` |
     | `TABLE_TYPE`, `ENGINE` of a stream in `information_schema.tables` | 
`VIEW`, `Stream` | `BASE TABLE`, `Stream` |
     | the `__doris_ivm_stream_*` streams of an incrementally refreshed MV | 
listed, `VIEW` | listed, `BASE TABLE` |
   
     Views keep `VIEW` and system tables `SYSTEM VIEW`. 
`information_schema.views`, `SHOW STREAMS`, `SHOW CREATE TABLE` and 
`information_schema.table_streams` are unchanged: they select streams and views 
by `TableType`, not by this string.
   - **Configs and defaults:** None.
   - **Impact on existing users:** None on released versions: table streams and 
incremental refresh are on neither branch-4.1 nor branch-4.2. On master, `SHOW 
FULL TABLES ... WHERE Table_type = 'VIEW'` and JDBC `getTables` with the type 
`VIEW` no longer return streams, and the type `TABLE` now does. Nothing is 
persisted: the type is computed whenever a listing is served.
   
   ### Testing
   
   - Regression test (new): `query_p0/schema_table/test_stream_table_type` 
creates a table, a stream on it and a view, and checks the stream and the view 
in `SHOW FULL TABLES`, all three in `information_schema.tables`, and that 
`information_schema.views` lists only the view. The `.out` is generated. On the 
code before this PR it fails at its first check: `Expect cell is: BASE TABLE`, 
`But real is: VIEW`.
   - FE unit test (new): `TableTypeTest` checks that a stream maps to `BASE 
TABLE` with the engine `Stream`, and that `VIEW`, `INLINE_VIEW`, `SCHEMA`, 
`OLAP` and `MATERIALIZED_VIEW` keep their types. `./run-fe-ut.sh --run 
org.apache.doris.catalog.TableTypeTest`: 2 tests, 0 failures.
   - Manual: an incrementally refreshed materialized view over a merge-on-write 
table with changelog; its `__doris_ivm_stream_*` stream is listed as `BASE 
TABLE` / `Stream` in both listings, and as `VIEW` / `Stream` before this PR.
   - Environment: a local cluster whose FE ran this branch's fe-core jar (and, 
for the before runs, a jar of the same base without this change), with a BE 
from an earlier master build (`6991e766329`); the change is FE-only.
   
   ### Notes for Reviewers
   
   - Why `BASE TABLE` and not a new value such as `STREAM`: MySQL defines `BASE 
TABLE`, `VIEW` and `SYSTEM VIEW`, and clients map and filter by them (MySQL 
Connector/J returns `BASE TABLE` rows as `TABLE` from `getTables`), so a new 
value would drop streams from client listings or break their type mapping.
   - Why the streams incremental refresh creates stay listed: they are real 
objects that `SHOW STREAMS` and `information_schema.table_streams` show and 
that can be queried; hiding them by their name prefix in some listings would 
make the listings disagree.
   - The incremental-refresh case is checked by hand rather than in the suite: 
it needs a merge-on-write base table with changelog, and a materialized view's 
`ENGINE` in `information_schema.tables` is about to change (#70523), which the 
`.out` would then depend on.
   
   ### Release note
   
   None
   
   ### Check List (For Author)
   
   - Behavior changed: Yes. Table streams are listed as `BASE TABLE` instead of 
`VIEW`; table streams are not released yet.
   - Does this need documentation: No. doris-website has no page on table 
streams yet.
   - Pre-submission status: Ready
   
   ### AI Disclosure
   
   - Tool: Claude Code (Claude Opus 5.5)
   - Generated: the code change, both tests and this description
   - Human review: not stated
   - Prompts: While integrating OpenMetadata with Doris, asked to fix in Doris 
that table streams are listed as views; chose to list every stream as BASE 
TABLE and not to hide the streams that incremental refresh creates.
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to