Skip to content

[refactor](changelog) Rename row binlog to changelog and split it from CCR binlog - #69311

Merged
morningman merged 6 commits into
apache:masterfrom
morningman:changelog-t1-rename
Oct 21, 2026
Merged

morningman merged 6 commits into
apache:masterfrom
morningman:changelog-t1-rename

Conversation

@morningman

@morningman morningman commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

What problem does this PR solve?

Issue Number: None

Related PR: #69238, #69240, #69242

Problem Summary:

In short. Row binlog (binlog.format = 'ROW'), the change stream that Table Stream and incremental materialized views (IVM) read, is renamed to changelog, and it gets its own configuration instead of riding on CCR's BinlogConfig. "Binlog" names a change stream in one fixed format; changelog is the general notion, and a binlog can later be built on top of it. The feature exists only on master and is documented as experimental, so this is a hard cut: there is no code that reads data written under the old names. Instead, guardrails make leftovers from an earlier master build fail with a clear message instead of crashing a process or being silently misread. CCR binlog and MySQL binlog CDC do not change.

Background.

The problem, and what it cost.

  1. One word for two features. CCR binlog (cross-cluster replication) and row binlog share property names, a switch, a configuration object and most code names, so every reader has to work out which one a binlog means.
  2. Row binlog leaks into every table. Every OLAP table created on master persists binlog.format and binlog.need_historical_value and prints them in SHOW CREATE TABLE, CCR tables included; a 4.x CCR downstream rejects that DDL as unknown properties.
  3. The shared keys interact badly.
    • ALTER DATABASE ... SET ("binlog.enable" = "true") on a database whose default is ROW validates the tables with the CCR rules, but what takes effect is the ROW default.
    • A table with binlog.format = ROW and binlog.enable = false can never be enabled: the error says "can't disable binlog when format is [Row]".
  4. Before-image columns clash with user columns (reproduced on master before this change). __BEFORE__<col>__ is not under the reserved __DORIS_ prefix, and schema change matched it with contains("__BEFORE__"):
User column What happened
__BEFORE__v1__ next to v1 the companion index had two columns named __BEFORE__v1__; @incr DETAIL returned after values in the UPDATE_BEFORE rows; the column could not be named in binlog() ("ambiguous"); as a key column every @incr read failed; after DROP COLUMN v1 every load failed
x__BEFORE__y as the last value column after ADD COLUMN v2 the companion index put v2 before it, so the two columns swapped values in every row written afterwards, without any error; with different types every later load failed with a bad cast
  1. FE and BE had two families of change codes with the same names and different values (DELETE is 1 in FE and 2 in BE).

How this PR fixes it.

  1. New names. User-visible ones:
Old New
"binlog.enable" = "true" + "binlog.format" = "ROW" "changelog.enable" = "true"
binlog.ttl_seconds (on a ROW table or database), binlog.need_historical_value changelog.ttl_seconds, changelog.need_historical_value
internal __binlog_config_version __changelog_config_version (no longer shown in information_schema.table_properties)
binlog(...) table function changelog(...)
__DORIS_BINLOG_{TSO,LSN,OP}__ __DORIS_CHANGELOG_{TSO,LSN,OP}__
__BEFORE__<col>__ __DORIS_CHANGELOG_BEFORE_<col>__
companion index binlog<Row>(t) changelog(t)
SHOW DATA BinlogSize / LocalBinlogSize, SHOW PARTITIONS BinlogSize, SHOW TABLET(S) / PROC IsRowBinlog, RowBinlog{Mismatch,Redundant}{Num,Tablets}, RowBinlogRepairReason ChangelogSize, LocalChangelogSize, IsChangelog, Changelog...
IVM fallback reasons BINLOG_BROKEN, BINLOG_NOT_ENABLED CHANGELOG_BROKEN, CHANGELOG_NOT_ENABLED
FE tablet_binlog_missing_timeout_second, tablet_binlog_missing_max_times tablet_changelog_missing_*
BE binlog_compaction_* (6), max_binlog_compaction_threads, cloud binlog_compaction_thread_num_factor changelog_compaction_*, max_changelog_compaction_threads, changelog_compaction_thread_num_factor
metrics compaction_task_state_total{type="binlog"}, tablet_binlog_max_compaction_score; bvars row_binlog_ttl_*; thread pools type="changelog", tablet_changelog_max_compaction_score, changelog_ttl_*, Changelog... pools
HTTP compact_type=row_binlog_ttl; compaction policy "binlog"; load profile RowsetBuilder {id} binlog<row> changelog_ttl; "changelog"; RowsetBuilder {id} changelog

CCR keeps every name: binlog.enable / ttl_seconds / max_bytes / max_history_nums, SHOW PROC '/binlog', getBinlog / ingest_binlog, BinlogManager.
2. Separate configuration.
- New ChangelogConfig (enable, ttlSeconds, needHistoricalValue, configVersion), stored as changelog.* keys in the table / database property map. BinlogConfig is back to the four CCR fields, so plain and CCR tables persist and print only the four binlog.* keys, as on 4.x.
- The wire format does not change. TabletBinlogConfig.of is now the only place that builds the TBinlogConfig / BinlogConfigPB sent to BE and the meta service: a changelog table still sends enable = true, binlog_format = 1 (now named CHANGELOG), its TTL, need_historical_value and config_version; plain and CCR tables send exactly what they sent before. The enum mapping is explicit instead of valueOf(name()).
- The TTL generation protocol (short TTL first, published after every tablet accepted it) moves unchanged to the changelog configuration.
- changelog.enable and changelog.need_historical_value can only be set at CREATE; changelog.ttl_seconds can be altered. binlog.format and binlog.need_historical_value are rejected in every DDL, naming their replacement.
- In a database whose default is "changelog.enable" = "true", SHOW CREATE TABLE of a table without changelog prints "changelog.enable" = "false" (output only), so CREATE TABLE LIKE and re-running the DDL keep it out of the default. Temporary tables never have changelog: an explicit "changelog.enable" = "true" fails, a database default is ignored.
- CCR and changelog stay mutually exclusive, now by explicit checks in CREATE / ALTER DATABASE, CREATE / ALTER TABLE and RECOVER TABLE: the CCR full sync relies on backup / restore, which changelog tables do not support, and one tablet carries only one BinlogConfigPB.
- New switch enable_feature_changelog (FE and BE) gates changelog tables, TSO allocation, Table Stream INSERT, TTL cleanup and the changelog part of SHOW CREATE. enable_feature_binlog is back to CCR only.
3. IDL names of the row-only elements are renamed; ids, enum values and types are unchanged, and shared names (TBinlogConfig, BinlogConfigPB, binlog_config, binlog_format) stay:

File Old (id) New
AgentService.thrift TTabletRole.TABLET_ROLE_ROW_BINLOG (1), TBinlogFormat.ROW (1) TABLET_ROLE_CHANGELOG, CHANGELOG
Descriptors.thrift TOlapTableIndexSchema.row_binlog_id (7), TOlapTableSchemaParam.row_binlog_index_schemas (17) changelog_index_id, changelog_index_schemas
HeartbeatService.thrift TMasterInfo.row_binlog_ttl_reference_tso (15) changelog_ttl_reference_tso
PlanNodes.thrift TBinlogScanType, TPaloScanRange.binlog_scan_type (12), TOlapScanNode.read_row_binlog (26) TChangelogScanType, changelog_scan_type, read_changelog
olap_file.proto RowsetMeta(Cloud)PB.is_row_binlog (58), TabletMeta(Cloud)PB.binlog_tablet_id (37 / 42), TabletRolePB.TABLET_ROLE_ROW_BINLOG (1), BinlogFormatPB.ROW (1) is_changelog, changelog_tablet_id, TABLET_ROLE_CHANGELOG, CHANGELOG
descriptors.proto POlapTableIndexSchema.row_binlog_id (6), POlapTableSchemaParam.row_binlog_index_schemas (18) changelog_index_id, changelog_index_schemas
internal_service.proto PTabletWithPartition.binlog_tablet_id (3), PSyncTabletMetaRequest.discover_row_binlog_ttl (2) changelog_tablet_id, discover_changelog_ttl
cloud.proto TabletCompactionJobPB.row_binlog_ttl_seconds (31) changelog_ttl_seconds
  1. Guardrails for leftovers of an earlier master build.
    • FE, on image load, edit log replay and backup restore: plain and CCR tables and databases drop the three old keys and behave exactly as before. A table that still says binlog.format = ROW with binlog.enable = true cannot be used except by DROP; queries (including @incr, changelog() and streams), every load path and DDL fail with Table <db>.<t> was created with "binlog.format" = "ROW", which is no longer supported; drop the table and create it again with "changelog.enable" = "true". Background daemons skip it instead of throwing or rebuilding its companion tablets. A database whose default was ROW gets binlog.enable = false back, with a warning, so it does not turn into a CCR database.
    • BE: publishing a load that an older BE committed on a changelog rowset without the new hidden columns fails with an error instead of reading column -1 (which crashed the BE on every publish retry). A changelog tablet uses the changelog compaction policy by its role, whatever policy string its meta carries; an unknown policy string falls back to size_based with a warning (looking it up used to throw and abort the BE on every restart); the derive stage returns an error instead of a CHECK when the hidden columns are missing; a changelog read or compaction without the TSO column fails instead of writing NULL TSO.
  2. Before-image columns are __DORIS_CHANGELOG_BEFORE_<col>__. A user cannot create a column under __DORIS_, every check uses this prefix, and IvmUtil.isCommonHiddenSlot excludes it (a user column ending in _COL would otherwise look like a common hidden slot).
  3. Change codes have two name families: FE CHANGE_TYPE_* (folded change types) and BE CHANGELOG_OP_* (persisted op values). Values do not change.
  4. Every persisted or externally hard-coded name has an // ATTN(changelog-rename): formerly "<old>" line at its definition, so a later compatibility layer knows what to map.

Results.

Scenario Before After
SHOW CREATE TABLE of a plain or CCR table prints binlog.format, and binlog.need_historical_value on ROW tables prints the four CCR binlog.* keys only (plus "changelog.enable" = "false" in a database whose default enables changelog)
ALTER DATABASE ... SET ("binlog.enable"="true") on a database whose tables use changelog CCR checks, ROW default applied rejected: Can not enable binlog in database <db> because table <t> enables changelog
user column __BEFORE__v1__ / x__BEFORE__y with before images wrong or swapped values, failing loads ordinary user columns; values correct (test_changelog_before_column_name)
FE and BE of this PR started on metadata written by an earlier master build (9 ROW tables) — both start; one WARN per old table; SHOW / DESC work; SELECT, INSERT, UPDATE, DELETE, ALTER, TRUNCATE, @incr, changelog(), CREATE TABLE LIKE and CREATE STREAM fail with the message above; DROP works and removes base and companion tablets; no repeating errors afterwards
BE restarted on old changelog tablets with policy "binlog" looking the policy up throws std::out_of_range (local mode) the tablets load with role changelog and policy "changelog"

Upgrade from an earlier master build (none of this applies to a release):

  • Before upgrading, drop every table created with "binlog.format" = "ROW" together with its Table Streams and incremental MVs, and set "binlog.enable" = "false" on databases whose default was ROW. Recreate them with "changelog.enable" = "true" afterwards. Do not create or alter changelog tables while FEs of both versions run; downgrade is not supported.
  • Add enable_feature_changelog = true to fe.conf and be.conf; enable_feature_binlog no longer enables changelog or TSO.
  • Renamed FE / BE configs are not aliased: old names in conf files are ignored. Update dashboards that use the renamed metrics, bvars, thread-pool labels and SHOW columns.
  • SQL and views that reference binlog(...), the hidden columns or the before columns must use the new names. Before-image columns now carry the reserved __DORIS_ prefix, so CREATE VIEW / CTAS / MTMV AS SELECT * FROM changelog(...) on a table with changelog.need_historical_value has to list its columns (as it already had to for the TSO / LSN / OP columns). Flink Doris Connector incremental reads need a connector release that knows the new hidden column names.

Release note

Rename the experimental row binlog to changelog: "changelog.enable" = "true" replaces "binlog.enable" = "true" with "binlog.format" = "ROW", changelog.ttl_seconds and changelog.need_historical_value replace the ROW uses of binlog.ttl_seconds and binlog.need_historical_value, the binlog() table function becomes changelog(), hidden columns become __DORIS_CHANGELOG_{TSO,LSN,OP}__ and before-image columns __DORIS_CHANGELOG_BEFORE_<col>__, and the new switch enable_feature_changelog (FE and BE) replaces enable_feature_binlog for changelog. Tables created by earlier master builds with "binlog.format" = "ROW" must be dropped and recreated.

Check List (For Author)

  • Test

    • Regression test

    • Unit Test

    • Manual test (add detailed scripts or steps below)

    • No need to test or manual test. Explain why:

      • This is a refactor/code format and no logic has been changed.
      • Previous test can cover this change.
      • No code files have been changed.
      • Other reason
    • FE UT: the 81 changed test classes, 1186 tests, pass. BE UT: the 62 changed suites, 692 tests, pass (3 unrelated skips).

    • Regression on a local cluster: changelog_p0 25/25, table_stream_p0 16/16, mtmv_p0/ivm 109/109, mtmv_ivm_restart_p0 2/2, time_travel_p0 5/5, tso_p0 3/3, auth_p0/test_changelog_tvf_auth, query_p0/system/test_table_properties, show_p0/test_show_create_table_and_views_nereids, bloom_filter_p0/test_bloom_filter_index. unique_with_mow_p0 107/109 and temp_table_p0/test_temp_table fail only on the local object storage credentials (S3 LOAD / CREATE REPOSITORY); the binlog checks of test_temp_table pass by hand. cloud_p0 was not run locally.

    • .out regenerated: test_changelog_property_keys, test_changelog_cluster_key, the new test_changelog_before_column_name, test_table_properties (only the rows of the three removed keys go away) and test_show_create_table_and_views_nereids (also drops 8 blocks the suite has not produced since [fix](regression) make regression test more stability #68449). test_group_commit_interval_ms_property.out is deleted: the suite has no qt_ call, so the file was never read, and it still held the removed binlog.format key. Result tags that said binlog are renamed, with regenerated .out showing only the tag lines changed.

    • Manual: the upgrade check in the Results table, on metadata written by master 15eb3f4e432.

    • CreateViewTest.testChangelogTtlViewAnalysis now waits for the TSO daemon to calibrate after it turns the switch on; the @incr view it creates needs a TSO, and the test raced with the daemon (the same race exists on master with enable_feature_binlog).

    • Rebased onto master 07887d2b327. After the rebase onto 33c460d7365, FE UT FrontendServiceImplTest (the one conflict), IvmAggDeltaHandlerTest, IvmNormalizeUniqKeysMTMVTest and TabletHealthProcDirTest pass, 123 tests. Cloud UT, all 33 test binaries in a Linux arm64 container, fails only MetaServiceTest.GetDeleteBitmapReturnsCompleteReplacementAfterTxnTooOld, which [fix](cloud) Skip stale delete bitmap aggregation #68084 and [fix](cloud) Restart incomplete delete bitmap reads after transaction expiry #68100 broke on master, and passes with its fix, [fix](cloud) Add the aggregation output rowset to the delete bitmap replacement test #69349, applied locally. The rebase from there onto 07887d2b327 brings in only [fix](paimon) Truncate evolved timestamps to target precision #68161 (Paimon) and [fix](cloud) Add the aggregation output rowset to the delete bitmap replacement test #69349, with no conflict.

    • TabletHealthProcDirTest.testCloudModeCountsTabletAsHealthy mocks Config.isCloudMode() on the test thread instead of switching Config.deploy_mode for the whole process, as [fix](test) Isolate cloud mode in colocation proc test #65515 did for ColocationGroupProcDirTest. The renames changed JUnit's method order, so the test no longer ran last; while it ran, a heartbeat took the cloud path, failed and marked both mock backends dead, and the next test could not create its table.

    • check_before_quit drops a table stream with DROP STREAM. It replays everything SHOW TABLES lists into its own database and dropped each object there with DROP TABLE, which refuses a stream. The rename moves regression_test_changelog_p0 ahead of regression_test_check_before_quit in name order, and test_changelog_before_column_name leaves an IVM stream there, so the copied stream reached that DROP TABLE.

    • test_ivm_minmax_count and test_ivm_minmax_count_join, which [feature](ivm) Track MIN/MAX extreme counts for incremental refresh #69286 added on master after this PR was opened, use the changelog properties.

    • test_changelog_property_keys sets "storage_format" = "V2" on the tables whose SHOW CREATE TABLE it checks, or on their LIKE sources. In fuzzy mode the FE draws use_v3_storage_format at random for each connection, and a table created without a storage format then gets V3, which SHOW CREATE TABLE prints; P0 failed on this in one of its two runs. On a local cluster (FE built from this branch after the rebase, BE from an earlier build of it) with SET GLOBAL use_v3_storage_format = true, the suite fails as on P0 without the change and passes with it, and all 25 changelog_p0 suites pass; with the default it passes, and -forceGenOut leaves its .out unchanged.

  • Behavior changed:

    • No.
    • Yes. The experimental row binlog is renamed to changelog (properties, table function, hidden columns, configs, metrics, SHOW columns); see the upgrade notes above.
  • Does this need documentation?

    • No.
    • Yes. The doris-website changelog / Table Stream pages follow in a separate PR.

Check List (For Reviewer who merge this PR)

  • Confirm the release note
  • Confirm test cases
  • Confirm document
  • Add branch pick label

@hello-stephen

Copy link
Copy Markdown
Contributor

Thank you for your contribution to Apache Doris.
Don't know what should be done next? See How to process your PR.

Please clearly describe your PR:

  1. What problem was fixed (it's best to include specific error reporting information). How it was fixed.
  2. Which behaviors were modified. What was the previous behavior, what is it now, why was it modified, and what possible impacts might there be.
  3. What features were added. Why was this function added?
  4. Which code was refactored and why was this part of the code refactored?
  5. Which functions were optimized and what is the difference before and after the optimization?

@morningman

Copy link
Copy Markdown
Contributor Author

run buildall

1 similar comment
@morningman

Copy link
Copy Markdown
Contributor Author

run buildall

@hello-stephen

Copy link
Copy Markdown
Contributor

FE Regression Coverage Report

Increment line coverage 50.68% (710/1401) 🎉
Increment coverage report
Complete coverage report

@hello-stephen

Copy link
Copy Markdown
Contributor

BE Regression && UT Coverage Report

Increment line coverage 85.03% (142/167) 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 77.22% (35799/46361)
Line Coverage 62.49% (404328/646996)
Region Coverage 58.95% (341508/579367)
Branch Coverage 59.88% (157810/263526)

@hello-stephen

Copy link
Copy Markdown
Contributor
TPC-H: Total hot run time: 28710 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpch-tools
Tpch sf100 test result on commit 8b6c36c95805feeb5f8c1218a5f17030fdaaace7, data reload: false

------ Round 1 ----------------------------------
============================================
q1	17590	5161	5099	5099
q2	2107	358	258	258
q3	10205	1410	854	854
q4	4680	475	347	347
q5	7450	824	537	537
q6	189	182	154	154
q7	784	809	604	604
q8	9260	1360	1047	1047
q9	5452	4198	4255	4198
q10	6849	1290	1026	1026
q11	440	255	228	228
q12	636	417	295	295
q13	18112	3658	3028	3028
q14	278	273	244	244
q15	q16	723	711	693	693
q17	1207	744	582	582
q18	7074	6203	6147	6147
q19	1108	963	601	601
q20	389	346	238	238
q21	5127	2264	2362	2264
q22	364	302	266	266
Total cold run time: 100024 ms
Total hot run time: 28710 ms

----- Round 2, with runtime_filter_mode=off -----
============================================
q1	5642	5635	5630	5630
q2	673	574	570	570
q3	5244	5366	4935	4935
q4	2004	2161	1560	1560
q5	5264	5144	5713	5144
q6	262	196	152	152
q7	2386	2109	1914	1914
q8	3174	2925	2780	2780
q9	7921	8101	8035	8035
q10	3901	3710	3217	3217
q11	615	434	418	418
q12	689	684	516	516
q13	3528	3843	3360	3360
q14	325	347	314	314
q15	q16	721	730	689	689
q17	8222	7459	7472	7459
q18	13014	12272	12968	12272
q19	933	830	825	825
q20	2140	2142	1917	1917
q21	5828	4847	4940	4847
q22	505	457	430	430
Total cold run time: 72991 ms
Total hot run time: 66984 ms

@hello-stephen

Copy link
Copy Markdown
Contributor
TPC-DS: Total hot run time: 150927 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpcds-tools
TPC-DS sf100 test result on commit 8b6c36c95805feeb5f8c1218a5f17030fdaaace7, data reload: false

query5	4331	583	446	446
query6	434	207	190	190
query7	4806	434	234	234
query8	313	165	146	146
query9	8794	3121	3115	3115
query10	481	304	254	254
query11	5900	3866	3572	3572
query12	164	89	85	85
query13	1246	431	307	307
query14	6137	3903	3647	3647
query14_1	3400	3397	3441	3397
query15	208	205	184	184
query16	958	509	449	449
query17	835	654	509	509
query18	2407	424	299	299
query19	187	163	125	125
query20	83	82	82	82
query21	202	123	105	105
query22	12992	12991	12862	12862
query23	13402	12827	12377	12377
query23_1	12573	12459	12444	12444
query24	7376	816	455	455
query24_1	462	468	465	465
query25	510	393	337	337
query26	1265	262	134	134
query27	2768	428	271	271
query28	4688	1957	1976	1957
query29	1558	606	462	462
query30	300	207	177	177
query31	1011	924	821	821
query32	145	87	88	87
query33	517	296	233	233
query34	963	847	495	495
query35	742	768	651	651
query36	814	807	716	716
query37	131	106	85	85
query38	1768	1720	1687	1687
query39	790	794	742	742
query39_1	732	736	735	735
query40	220	120	98	98
query41	74	71	67	67
query42	93	86	88	86
query43	345	359	315	315
query44	1292	686	715	686
query45	180	177	161	161
query46	806	953	560	560
query47	2782	2866	2870	2866
query48	322	308	218	218
query49	589	430	302	302
query50	694	279	205	205
query51	10469	10347	10383	10347
query52	82	80	73	73
query53	187	213	152	152
query54	257	210	208	208
query55	88	71	64	64
query56	254	245	236	236
query57	1656	1638	1563	1563
query58	286	271	268	268
query59	2122	2109	1921	1921
query60	292	252	239	239
query61	168	163	167	163
query62	399	333	290	290
query63	193	155	161	155
query64	2854	934	769	769
query65	3323	3256	3269	3256
query66	1790	415	303	303
query67	20069	20240	20034	20034
query68	3255	992	600	600
query69	400	294	251	251
query70	849	768	735	735
query71	292	234	224	224
query72	2809	2620	2378	2378
query73	529	533	291	291
query74	4697	4510	4369	4369
query75	2376	2295	1932	1932
query76	2402	1009	574	574
query77	352	356	271	271
query78	9869	9835	9218	9218
query79	956	890	521	521
query80	755	416	332	332
query81	560	316	270	270
query82	582	131	106	106
query83	287	192	190	190
query84	311	126	102	102
query85	973	432	375	375
query86	352	241	237	237
query87	1992	1913	1828	1828
query88	3633	2664	2647	2647
query89	337	286	252	252
query90	1692	169	164	164
query91	158	155	125	125
query92	100	92	89	89
query93	980	987	569	569
query94	504	306	279	279
query95	576	323	362	323
query96	679	471	235	235
query97	2427	2429	2315	2315
query98	199	161	152	152
query99	778	761	651	651
Total cold run time: 234699 ms
Total hot run time: 150927 ms

@hello-stephen

Copy link
Copy Markdown
Contributor
ClickBench: Total hot run time: 24.42 s
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/clickbench-tools
ClickBench test result on commit 8b6c36c95805feeb5f8c1218a5f17030fdaaace7, data reload: false

query1	0.01	0.00	0.00
query2	0.11	0.05	0.05
query3	0.27	0.09	0.08
query4	1.64	0.11	0.11
query5	0.27	0.23	0.24
query6	1.18	0.68	0.67
query7	0.04	0.01	0.00
query8	0.05	0.04	0.04
query9	0.41	0.35	0.36
query10	0.55	0.56	0.57
query11	0.21	0.15	0.15
query12	0.18	0.14	0.14
query13	0.50	0.50	0.49
query14	1.05	1.02	1.01
query15	0.64	0.61	0.61
query16	0.35	0.35	0.35
query17	1.14	1.12	1.14
query18	0.21	0.18	0.18
query19	2.04	1.91	1.97
query20	0.02	0.01	0.01
query21	15.46	0.18	0.13
query22	4.90	0.06	0.05
query23	16.27	0.30	0.13
query24	2.71	0.53	0.48
query25	0.11	0.06	0.05
query26	1.53	0.22	0.16
query27	0.04	0.03	0.05
query28	3.32	0.71	0.37
query29	12.46	4.17	3.29
query30	0.28	0.14	0.10
query31	2.76	0.55	0.32
query32	3.22	0.60	0.51
query33	3.12	3.21	3.27
query34	15.57	4.00	3.42
query35	3.35	3.37	3.32
query36	0.54	0.48	0.44
query37	0.10	0.06	0.07
query38	0.05	0.04	0.03
query39	0.04	0.03	0.03
query40	0.17	0.14	0.15
query41	0.09	0.03	0.03
query42	0.04	0.03	0.03
query43	0.04	0.03	0.04
Total cold run time: 97.04 s
Total hot run time: 24.42 s

@morningman

Copy link
Copy Markdown
Contributor Author

run buildall

@hello-stephen

Copy link
Copy Markdown
Contributor
TPC-H: Total hot run time: 28696 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpch-tools
Tpch sf100 test result on commit 09d290064c8e83d8e743ac47901efa29250592c5, data reload: false

------ Round 1 ----------------------------------
============================================
q1	17618	5135	5073	5073
q2	2087	317	263	263
q3	10118	1399	804	804
q4	4700	462	333	333
q5	7439	788	532	532
q6	179	188	152	152
q7	753	799	601	601
q8	9251	1312	1101	1101
q9	5466	4181	4179	4179
q10	6829	1276	1005	1005
q11	452	244	228	228
q12	639	399	273	273
q13	18125	3582	3018	3018
q14	281	261	249	249
q15	q16	749	724	683	683
q17	1213	776	577	577
q18	6947	6158	6123	6123
q19	1113	952	599	599
q20	392	342	234	234
q21	5689	2446	2392	2392
q22	361	346	277	277
Total cold run time: 100401 ms
Total hot run time: 28696 ms

----- Round 2, with runtime_filter_mode=off -----
============================================
q1	5954	5865	6280	5865
q2	722	572	560	560
q3	5564	5626	5187	5187
q4	1996	2175	1563	1563
q5	5935	5697	5820	5697
q6	238	192	143	143
q7	2244	2008	1799	1799
q8	2980	2605	2683	2605
q9	7545	7476	7464	7464
q10	3614	3579	3148	3148
q11	583	405	375	375
q12	655	654	492	492
q13	3279	3562	3026	3026
q14	302	285	263	263
q15	q16	664	673	605	605
q17	7715	6978	6883	6883
q18	12979	12229	12820	12229
q19	936	818	820	818
q20	2109	2131	1913	1913
q21	5496	4560	4674	4560
q22	504	442	412	412
Total cold run time: 72014 ms
Total hot run time: 65607 ms

@hello-stephen

Copy link
Copy Markdown
Contributor
TPC-DS: Total hot run time: 150482 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpcds-tools
TPC-DS sf100 test result on commit 09d290064c8e83d8e743ac47901efa29250592c5, data reload: false

query5	4354	582	452	452
query6	436	203	193	193
query7	4797	455	224	224
query8	315	164	157	157
query9	8773	3093	3106	3093
query10	496	314	261	261
query11	6041	3844	3611	3611
query12	149	94	89	89
query13	1250	449	322	322
query14	6153	3946	3680	3680
query14_1	3439	3414	3431	3414
query15	209	200	183	183
query16	945	415	408	408
query17	864	658	545	545
query18	2465	428	311	311
query19	199	175	136	136
query20	87	87	85	85
query21	212	130	107	107
query22	13086	13062	12740	12740
query23	13460	12928	12413	12413
query23_1	12457	12421	12548	12421
query24	7357	829	462	462
query24_1	472	488	484	484
query25	557	443	365	365
query26	1290	268	148	148
query27	2766	441	274	274
query28	4607	1939	1964	1939
query29	1535	576	454	454
query30	293	218	190	190
query31	1017	920	808	808
query32	139	92	88	88
query33	521	292	228	228
query34	883	854	495	495
query35	736	779	633	633
query36	851	824	724	724
query37	123	92	82	82
query38	1761	1724	1659	1659
query39	796	799	749	749
query39_1	727	727	740	727
query40	223	113	91	91
query41	64	63	62	62
query42	84	83	79	79
query43	341	364	307	307
query44	1286	675	686	675
query45	178	186	159	159
query46	829	958	573	573
query47	2964	2947	2653	2653
query48	303	300	226	226
query49	577	395	293	293
query50	681	275	203	203
query51	10569	10499	10378	10378
query52	77	85	78	78
query53	194	205	167	167
query54	258	200	177	177
query55	78	67	62	62
query56	226	225	223	223
query57	1676	1620	1569	1569
query58	289	267	257	257
query59	2165	2164	1940	1940
query60	303	256	223	223
query61	166	146	152	146
query62	386	331	285	285
query63	186	162	164	162
query64	2744	988	763	763
query65	3303	3257	3262	3257
query66	1770	422	298	298
query67	20239	20221	20000	20000
query68	3216	1008	598	598
query69	409	288	266	266
query70	827	762	746	746
query71	294	240	218	218
query72	2828	2658	2333	2333
query73	514	529	292	292
query74	4666	4497	4365	4365
query75	2348	2267	1909	1909
query76	2299	1016	590	590
query77	342	386	274	274
query78	9712	9697	9158	9158
query79	895	841	510	510
query80	530	432	363	363
query81	522	331	269	269
query82	572	134	106	106
query83	298	204	183	183
query84	308	125	99	99
query85	822	426	374	374
query86	305	241	227	227
query87	1972	1984	1790	1790
query88	3617	2671	2638	2638
query89	322	275	244	244
query90	1871	170	166	166
query91	165	155	132	132
query92	101	89	83	83
query93	1002	982	569	569
query94	449	308	267	267
query95	579	324	318	318
query96	653	478	239	239
query97	2437	2413	2320	2320
query98	165	156	148	148
query99	779	771	641	641
Total cold run time: 234350 ms
Total hot run time: 150482 ms

@hello-stephen

Copy link
Copy Markdown
Contributor
TPC-H: Total hot run time: 28642 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpch-tools
Tpch sf100 test result on commit 15a4cab3d64d858096a68edf7b3fb54833e06970, data reload: false

------ Round 1 ----------------------------------
============================================
q1	17376	5252	5090	5090
q2	2087	302	251	251
q3	10151	1385	841	841
q4	4672	456	336	336
q5	7438	808	545	545
q6	183	186	155	155
q7	774	806	604	604
q8	9258	1365	1042	1042
q9	5465	4215	4172	4172
q10	6824	1288	1041	1041
q11	431	253	241	241
q12	644	402	284	284
q13	18104	3552	3026	3026
q14	281	274	263	263
q15	q16	742	726	668	668
q17	1222	753	602	602
q18	7052	6167	6161	6161
q19	1104	963	614	614
q20	387	336	225	225
q21	4970	2228	2373	2228
q22	356	291	253	253
Total cold run time: 99521 ms
Total hot run time: 28642 ms

----- Round 2, with runtime_filter_mode=off -----
============================================
q1	5611	5614	5608	5608
q2	668	587	535	535
q3	5194	5411	4971	4971
q4	2014	2145	1569	1569
q5	5255	5237	5514	5237
q6	262	205	162	162
q7	2323	1949	1849	1849
q8	2958	2719	2707	2707
q9	8139	7952	7951	7951
q10	3744	3645	3249	3249
q11	642	434	393	393
q12	846	762	511	511
q13	3593	3964	3181	3181
q14	310	324	307	307
q15	q16	713	719	626	626
q17	8260	7435	6875	6875
q18	13005	12154	12839	12154
q19	939	795	790	790
q20	2146	2161	1913	1913
q21	5606	4578	4687	4578
q22	488	448	406	406
Total cold run time: 72716 ms
Total hot run time: 65572 ms

@hello-stephen

Copy link
Copy Markdown
Contributor
TPC-DS: Total hot run time: 151086 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpcds-tools
TPC-DS sf100 test result on commit 15a4cab3d64d858096a68edf7b3fb54833e06970, data reload: false

query5	4304	601	449	449
query6	426	220	190	190
query7	4805	442	222	222
query8	339	180	172	172
query9	8778	3129	3121	3121
query10	471	308	256	256
query11	5982	3873	3589	3589
query12	145	93	88	88
query13	1257	448	321	321
query14	6028	3946	3660	3660
query14_1	3459	3458	3482	3458
query15	205	194	182	182
query16	932	411	313	313
query17	831	651	519	519
query18	2412	415	300	300
query19	183	163	128	128
query20	83	92	81	81
query21	212	123	106	106
query22	13032	12930	12764	12764
query23	13401	12855	12459	12459
query23_1	12452	12618	12640	12618
query24	7347	814	456	456
query24_1	462	454	463	454
query25	510	412	344	344
query26	1271	246	137	137
query27	2798	432	268	268
query28	4618	1900	1923	1900
query29	1536	604	425	425
query30	294	217	184	184
query31	1008	944	824	824
query32	151	101	95	95
query33	532	306	248	248
query34	899	845	508	508
query35	752	754	635	635
query36	828	809	712	712
query37	128	100	81	81
query38	1763	1733	1645	1645
query39	787	785	752	752
query39_1	726	731	735	731
query40	214	112	95	95
query41	66	64	64	64
query42	85	81	82	81
query43	354	355	310	310
query44	1284	671	676	671
query45	176	172	162	162
query46	817	955	567	567
query47	2910	2861	2846	2846
query48	290	310	218	218
query49	565	400	296	296
query50	664	274	205	205
query51	10354	10425	10242	10242
query52	79	82	73	73
query53	186	214	152	152
query54	243	195	178	178
query55	79	66	64	64
query56	229	226	218	218
query57	1665	1616	1594	1594
query58	282	264	259	259
query59	2114	2169	1941	1941
query60	283	249	225	225
query61	151	145	138	138
query62	393	339	287	287
query63	187	156	155	155
query64	2744	1051	892	892
query65	3326	3253	3268	3253
query66	1792	433	337	337
query67	20164	20133	20040	20040
query68	2996	986	607	607
query69	401	301	268	268
query70	864	809	747	747
query71	301	245	216	216
query72	2898	2724	2434	2434
query73	505	518	289	289
query74	4632	4481	4366	4366
query75	2322	2258	1924	1924
query76	2289	1021	589	589
query77	341	383	279	279
query78	9767	9703	9156	9156
query79	975	829	515	515
query80	835	426	334	334
query81	572	322	271	271
query82	566	139	101	101
query83	302	203	179	179
query84	301	119	101	101
query85	911	417	364	364
query86	352	241	231	231
query87	2020	1950	1809	1809
query88	3595	2641	2630	2630
query89	326	280	239	239
query90	1776	175	161	161
query91	159	155	128	128
query92	99	87	87	87
query93	985	1010	613	613
query94	545	301	283	283
query95	570	381	292	292
query96	655	480	224	224
query97	2465	2477	2330	2330
query98	162	150	148	148
query99	777	753	649	649
Total cold run time: 233731 ms
Total hot run time: 151086 ms

@hello-stephen

Copy link
Copy Markdown
Contributor
ClickBench: Total hot run time: 25.16 s
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/clickbench-tools
ClickBench test result on commit 15a4cab3d64d858096a68edf7b3fb54833e06970, data reload: false

query1	0.01	0.01	0.01
query2	0.13	0.08	0.07
query3	0.35	0.13	0.12
query4	1.60	0.13	0.14
query5	0.27	0.25	0.23
query6	1.15	0.65	0.66
query7	0.04	0.01	0.00
query8	0.08	0.07	0.07
query9	0.44	0.33	0.34
query10	0.56	0.61	0.60
query11	0.31	0.19	0.19
query12	0.31	0.18	0.18
query13	0.52	0.53	0.52
query14	0.94	0.93	0.93
query15	0.67	0.57	0.60
query16	0.34	0.35	0.36
query17	1.00	1.03	1.03
query18	0.29	0.27	0.27
query19	1.98	1.79	1.87
query20	0.02	0.02	0.02
query21	15.42	0.35	0.30
query22	4.96	0.13	0.12
query23	15.87	0.49	0.29
query24	2.27	0.54	0.39
query25	0.16	0.10	0.09
query26	0.76	0.27	0.21
query27	0.10	0.10	0.10
query28	3.42	0.79	0.39
query29	12.61	4.42	3.40
query30	0.34	0.16	0.14
query31	2.78	0.60	0.33
query32	3.23	0.61	0.48
query33	2.98	3.03	2.98
query34	15.90	4.12	3.46
query35	3.40	3.40	3.42
query36	0.61	0.51	0.48
query37	0.11	0.09	0.09
query38	0.07	0.07	0.06
query39	0.06	0.06	0.06
query40	0.19	0.17	0.16
query41	0.11	0.05	0.05
query42	0.06	0.07	0.06
query43	0.06	0.06	0.06
Total cold run time: 96.48 s
Total hot run time: 25.16 s

@hello-stephen

Copy link
Copy Markdown
Contributor

FE Regression Coverage Report

Increment line coverage 42.48% (689/1622) 🎉
Increment coverage report
Complete coverage report

@hello-stephen

Copy link
Copy Markdown
Contributor

BE Regression && UT Coverage Report

Increment line coverage 85.03% (142/167) 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 77.09% (35793/46429)
Line Coverage 62.32% (403610/647652)
Region Coverage 58.73% (340456/579731)
Branch Coverage 59.74% (157600/263825)

@morningman
morningman merged commit 73a987e into apache:master Oct 21, 2026
46 checks passed
@github-actions

Copy link
Copy Markdown
Contributor

PR approved by anyone and no changes requested.

@github-actions github-actions Bot added the approved Indicates a PR has been approved by one committer. label Oct 21, 2026
@github-actions

Copy link
Copy Markdown
Contributor

PR approved by at least one committer and no changes requested.

hello-stephen pushed a commit that referenced this pull request Oct 21, 2026
Related PR: #69311, #69268, #63639

Problem Summary: #69311 renamed the row binlog (the change stream IVM
reads) to **changelog** and rejected the legacy keys `binlog.format` /
`binlog.need_historical_value` in every DDL. Two test files merged just
before it fell outside that rename sweep and now fail:

1.
`regression-test/suites/mtmv_p0/ivm/test_ivm_datetime_sequence.groovy`
(from #69268) — creates its IVM base tables with `"binlog.enable" =
"true", "binlog.format" = "ROW", "binlog.need_historical_value" =
"true"`, which CREATE TABLE now rejects.
2.
`RelationImpliedPredicateTest#testIvmOutputPredicatesSkipHiddenColumns`
(from #63639) — same legacy properties in the base-table DDL, and it
gates the creation on `enable_feature_binlog` instead of the new
`enable_feature_changelog`.

Fix: switch both to `"changelog.enable" = "true"` (plus
`"changelog.need_historical_value" = "true"` where the before-image is
needed), drop the rejected `binlog.format`, and use
`enable_feature_changelog` as the feature gate in the FE unit test.
Related IVM trace issue: #65418 .
morningman added a commit to apache/doris-flink-connector that referenced this pull request Oct 21, 2026
…710)

Doris renamed the unreleased row binlog feature, which the incremental
source reads, to changelog (apache/doris#69311). A table now enables it
with "changelog.enable" = "true" instead of "binlog.enable" = "true"
plus "binlog.format" = "ROW", Doris rejects the old binlog.format and
binlog.need_historical_value properties, and the hidden columns are now
__DORIS_CHANGELOG_TSO__, __DORIS_CHANGELOG_LSN__ and
__DORIS_CHANGELOG_OP__. The @incr syntax, the increment types,
information_schema.tso_status and error code 5101 are unchanged. The
source still selected and ordered by the __DORIS_BINLOG_*__ columns, so
it could not read Doris master after that rename.

Query and read the new hidden columns, and rename the connector's own
row binlog names to changelog so they match the Doris feature:

- source.binlog.increment-type -> source.changelog.increment-type
- source.binlog.poll-interval -> source.changelog.poll-interval
- source.binlog.visible-wait-timeout -> source.changelog.visible-wait-timeout
- source.binlog.offset-table -> source.changelog.offset-table
- source.binlog.consumer-id -> source.changelog.consumer-id
- DorisConfigOptions.SOURCE_BINLOG_* -> SOURCE_CHANGELOG_*
- ConfigurationOptions.SOURCE_BINLOG_VISIBLE_WAIT_TIMEOUT_MS_DEFAULT
  -> SOURCE_CHANGELOG_VISIBLE_WAIT_TIMEOUT_MS_DEFAULT
- DorisBinlogIncrementType -> DorisChangelogIncrementType
- DorisReadOptions getBinlog*() and Builder.setBinlog*()
  -> getChangelog*() and setChangelog*()
- DorisSourceRecord getBinlogTso/Lsn/Op() -> getChangelogTso/Lsn/Op()

This is a hard rename without deprecated keys: a Flink table that still
sets a source.binlog.* option fails option validation as an unsupported
option. Those keys only ever worked against Doris master builds from
before the rename, and the connector no longer reads such builds. The
integration and end-to-end fixtures create their tables with
"changelog.enable" and "changelog.need_historical_value". MySQL binlog,
Flink CDC and Debezium code is unchanged, and so are the split and
checkpoint formats.

Co-authored-by: morningman <moringman@apache.org>
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
morningman added a commit to apache/doris-website that referenced this pull request Oct 21, 2026
## Summary

Rename the experimental row binlog to **changelog** in the English and
Chinese docs, following apache/doris#69311. Three pages move to new URLs
(old URLs redirect in every locale), every page that mentions the
feature uses the new property names, table function, hidden columns,
error messages and switch, and the changelog page now describes the
behavior #69311 introduced.

## Why

apache/doris#69311 renamed row binlog (`"binlog.enable" = "true"` +
`"binlog.format" = "ROW"`, the change stream that Table Stream and
incremental materialized views read) to changelog and split it from CCR
binlog. It is a hard cut on an unreleased feature, so the docs on master
describe names that no longer exist:

| Before | After |
|---|---|
| `"binlog.enable" = "true"` + `"binlog.format" = "ROW"` |
`"changelog.enable" = "true"` |
| `binlog.ttl_seconds` (ROW tables), `binlog.need_historical_value` |
`changelog.ttl_seconds`, `changelog.need_historical_value` |
| `binlog(...)` table function | `changelog(...)` |
| `__DORIS_BINLOG_{TSO,LSN,OP}__`, `__BEFORE__<col>__` |
`__DORIS_CHANGELOG_{TSO,LSN,OP}__`, `__DORIS_CHANGELOG_BEFORE_<col>__` |
| `enable_feature_binlog` (FE, BE) for row binlog and TSO |
`enable_feature_changelog`; `enable_feature_binlog` is CCR only |

CCR binlog, `SHOW PROC '/binlog'`, MySQL binlog CDC, Canal binlog load
and Paimon `$binlog` do not change.

## Renamed pages and redirects

| Old URL | New URL |
|---|---|
| `/docs/dev/data-operate/incremental/row-binlog` |
`/docs/dev/data-operate/incremental/changelog` |
| `/docs/dev/sql-manual/sql-functions/table-valued-functions/binlog` |
`/docs/dev/sql-manual/sql-functions/table-valued-functions/changelog` |
| `/docs/dev/key-features/binlog-table-stream` |
`/docs/dev/key-features/changelog-table-stream` |
| `/docs/4.x/key-features/binlog-table-stream` |
`/docs/4.x/key-features/changelog-table-stream` |

The same four mappings apply under `/zh-CN`, `/ja`, `/ko` and `/ru`. The
redirects are one loop over `ENABLED_LOCALES` in `buildRedirectIndex()`
(`docusaurus.config.js`), next to the DOG Stack block and in the style
of the hackathon redirects, so each optional locale gets them as soon as
it is enabled. They are not in `config/redirects-dev.json`, which lists
en and zh-CN paths only, nor in `config/redirects-4.x.json`, which
`scripts/migrate-4.x/build-redirects.py` generates. Evaluating
`createRedirects` from the site config gives 20 old paths with
`DORIS_ENABLE_LOCALES=ja,ko,ru` and 8 with the default locales.

The PR has two commits so the moves stay reviewable: the first only
moves the six files (en / zh-CN, dev / 4.x), and the second rewrites
them. The rewritten pages keep 36–41% of their text, so the combined
diff shows them as delete + add; look at the second commit to see what
changed in them.

The key-features slug is now `/key-features/changelog-table-stream`. The
card image keeps its name (`binlog-table-stream.jpg`): pages reference
it by path, nothing pairs it with the page by file name. `sidebars.ts`
points to the new doc ids; the table function moves to its alphabetical
place.

## Other changes

- The changelog page documents the new behavior: `changelog.enable` and
`changelog.need_historical_value` can only be set by `CREATE TABLE`,
`changelog.ttl_seconds` can be altered, `binlog.format` and
`binlog.need_historical_value` are rejected, CCR binlog and changelog
are mutually exclusive (table, database, `RECOVER TABLE`), temporary
tables never have changelog, a database can make changelog the default
and `SHOW CREATE TABLE` then prints `"changelog.enable" = "false"` for
tables without it, views / CTAS / MTMV over `changelog()` must list and
alias the `__DORIS_` columns, and `enable_feature_changelog` is needed
in `fe.conf` (and `be.conf` for cleanup). A short note says the feature
was called row binlog in earlier development builds and that tables
created that way must be recreated.
- Every quoted error message matches the FE on Doris master, for example
`Changelog offset has expired according to changelog.ttl_seconds`, `INCR
query requires changelog enabled on base table.`, `Base Olap table ...
need to enable changelog for table stream`, `Not allowed to perform
current operation on Table With changelog`.
- Stale content fixed:
  - `binlog.format` case sensitivity (the property no longer exists);
- the key-features pages enabled ROW with `ALTER TABLE ... SET
("binlog.format" = "ROW")`; changelog can only be enabled by `CREATE
TABLE`;
  - the OP hidden column is `BIGINT`, not `TINYINT`;
- the changelog page said backup / restore work as usual; the FE rejects
backup and restore of tables with changelog;
- the key-features pages described CCR binlog and ROW as two formats of
one binlog; changelog is a separate, per-table change stream that cannot
be combined with CCR binlog. The same pages also used `CREATE STREAM ...
ON <table>` and `"type" = "default"` (now `ON TABLE` and `min_delta`),
listed a `default` consume type (now `detail` / `append_only` /
`min_delta`), and said retention waits for streams and is reported in
`STALE_REASON` (it does neither).
- Table Stream, incremental query, IVM, CREATE TABLE / CREATE STREAM /
DROP STREAM, CREATE ASYNC MATERIALIZED VIEW, MV FAQ, TSO and FE
configuration pages use the new names. CREATE TABLE lists
`changelog.ttl_seconds`.
- Flink Doris Connector incremental reading uses the Doris-side names
and the connector's renamed options
`source.changelog.{increment-type,poll-interval,visible-wait-timeout,offset-table,consumer-id}`
(apache/doris-flink-connector#710); it says "Doris changelog" where
Flink changelog records are also discussed. The required connector
version is now 26.4.0, the release expected to carry
apache/doris-flink-connector#710: 26.3.0 and earlier read the hidden
columns under their old names, so they only work with Doris development
builds from before the rename.
- The Data Warehousing use-case page links to the new key-features URL,
and the query cache decision-flow SVG says "changelog scan".

## Not changed on purpose

- Japanese, Korean and Russian docs and `translations/`: the translation
pipeline re-translates the edited pages and handles the moved ones.
Until then their old translated files are orphaned and the moved pages
show English. The ja / ko labels for `marketing.warehouse.075` still
read "Binlog / Table Stream".
- `src/pages/community-report/` (historical weekly reports),
`scripts/last-update/`, `scripts/migrate-4.x/`.
- CCR docs, `SHOW PROC '/binlog'`, MySQL binlog, Canal and Paimon
content.
- Raster images that still show the old name:
`static/images/next/data-operate/incremental/two-layers.png` and
`static/images/next/query-acceleration/ivm-workflow.jpg` ("Row Binlog"),
and the key-features card
`static/images/next/key-features/binlog-table-stream.jpg`
(`binlog.format = ROW`, and a CCR consumer arrow). Alt texts are
updated; the pictures need to be redrawn.

## Validation

- Static checks on every changed doc: front matter, relative links, MDX
tags, no CJK in English trees, table column counts: pass.
- `scripts/check_md_links_single.py --no-external` on all added /
modified en, zh-CN and 4.x docs: pass. Anchors in the touched files were
checked separately; the only unresolved ones are five pre-existing
anchors in zh-CN `CREATE-TABLE.md` and the MV FAQ, on lines this PR does
not change.
- No en / zh-CN doc, sidebar, component or config links to the old
paths; the remaining mentions of the old names are the rename note, the
rejected-property error messages, CCR / MySQL binlog, the redirect
sources and the card image path.
- `node scripts/check_move.js HEAD`, `python3 check_move.py HEAD` and
`python3 check_move.py <merge-base>`: pass.
- `node scripts/i18n/check-configuration.cjs --all`: pass.
- `I18N_LOCALE=<ja|ko|ru> node scripts/i18n/pr-preflight.cjs --base
<merge-base>` for each of the three locales: pass, 0 errors (source
freshness for these locales is reported, not blocking).
- `node --test` for the i18n `marketing-pages`, `doc-navigation`,
`configuration`, `t04`, `inventory`, `planner`, `multi-locale`,
`locale-registry` and `heading-ids` tests: pass.
- `scripts/key-features/generate.js` produces the card with href
`/docs/dev/key-features/changelog-table-stream`.
- The edited SVG parses and renders with the new text inside its boxes.
- No site build was run.

---------

Co-authored-by: morningman <moringman@apache.org>
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
airborne12 added a commit to airborne12/apache-doris that referenced this pull request Oct 22, 2026
### What problem does this PR solve?

Issue Number: None

Related PR: apache#69292

Problem Summary:

CI tests this PR on top of master, which renamed row binlog to changelog
(apache#69311), so the table stream test of 1be095e failed there with
"Property binlog.format is no longer supported". Merge master, which applies
without conflicts, so that the test can use the changelog syntax.

### Release note

None

### Check List (For Author)

- Test: No need to test (merge only; the next commit fixes the test and runs
  the tests)
- Behavior changed: No
- Does this need documentation: No

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
airborne12 added a commit to airborne12/apache-doris that referenced this pull request Oct 22, 2026
…ngelog syntax

### What problem does this PR solve?

Issue Number: None

Related PR: apache#69292

Problem Summary:

BindScoreToOlapScanTest created its table stream on a table with
'binlog.enable' and 'binlog.format' and enabled Config.enable_feature_binlog.
Master renamed row binlog to changelog (apache#69311) and rejects those
properties, so the test failed in CI, which runs on top of master. The test
now uses 'changelog.enable' and Config.enable_feature_changelog.

### Release note

None

### Check List (For Author)

- Test: Unit Test
    - On the tree merged with master: BindScoreToOlapScanTest (77 tests,
      including the table stream case), LogicalPlanDeepCopierTest,
      CTEInlineTest, SearchCteRewriteTest,
      PushDownVirtualColumnsIntoOlapScanTest,
      PushDownMatchProjectionAsVirtualColumnTest, PhysicalPlanTranslatorTest,
      TopNRuntimeFilterTest, LogicalOlapScanTest and SearchExpressionTest pass
      (169 tests). Checkstyle passes. The regression tests were not run
      locally after the merge, because the private cluster's BE is built
      from the old base; CI runs them on the merged code.
- Behavior changed: No
- Does this need documentation: No

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
morningman added a commit that referenced this pull request Oct 22, 2026
…angelog suites (#69374)

### What problem does this PR solve?

Issue Number: None

Related PR: #69311

Problem Summary: #69311 renamed row binlog to changelog. It also renamed
the result tags that said binlog in the changelog suites and regenerated
their .out files, except in the two suites that only run in cloud mode,
test_cloud_changelog_compaction and
test_cloud_changelog_publish_conflict: regenerating their .out files
needs a cloud cluster running that code. Those two suites still carry
nine tags that say binlog, such as qt_row_binlog_publish_conflict and
order_qt_cloud_dup_binlog_compaction.

This renames the nine tags in the two groovy files and the matching "--
!tag --" lines in the two .out files, the same way #69311 renamed the
tags of the other changelog suites (row_binlog -> changelog,
binlog_compaction -> changelog_compaction). The queries are unchanged,
so no result row changes. The .out files were edited by hand, only on
the nine tag lines, instead of being regenerated.

### Release note

None

### Check List (For Author)

- Test: No need to test. Only result tag names change; the queries and
the expected rows are unchanged. The two suites return early outside
cloud mode and were not run locally.
- Behavior changed: No
- Does this need documentation: No

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
morningman added a commit that referenced this pull request Oct 22, 2026
…ble (#69375)

### What problem does this PR solve?

Issue Number: None

Related PR: #69311

Problem Summary:

**In short.** CCR binlog is configured by four properties:
`binlog.enable`, `binlog.ttl_seconds`, `binlog.max_bytes` and
`binlog.max_history_nums`. `PropertyAnalyzer.analyzeBinlogConfig`, which
every DDL uses to check them, ignored any other key under `binlog.` and
read `binlog.enable` with `Boolean.parseBoolean`, so a misspelled key or
a value such as `"yes"` was accepted without a word. The worst case:
`ALTER TABLE t SET ("binlog.enable" = "yes")` succeeds and turns off the
CCR binlog of a table that had it on. This PR rejects both, the way
#69311 already made the `changelog.*` properties strict.

**Background.**
- Every DDL path validates the binlog properties with
`analyzeBinlogConfig`: CREATE DATABASE and ALTER DATABASE
(`CreateDatabaseCommand` / `AlterDatabasePropertiesCommand.validate`),
CREATE TABLE (`InternalCatalog.createOlapTable`) and ALTER TABLE
(`ModifyTablePropertiesOp.validate`, then
`SchemaChangeHandler.updateBinlogConfig`). Database properties are
stored as the user wrote them.
- #69311 split changelog (formerly row binlog) from CCR binlog. Its
`changelog.*` properties reject unknown keys (`Unknown changelog
property: <key>`) and accept only `true` / `false` for
`changelog.enable`; the replaced `binlog.format` and
`binlog.need_historical_value` are rejected in every DDL. The four CCR
keys kept the lenient parsing.

**The problem, and what it cost.** On a cluster running master before
this change:

| Statement | Before |
|---|---|
| `ALTER TABLE t SET ("binlog.enable" = "yes")`, `t` has binlog on |
succeeds; `t`'s binlog is now off |
| `CREATE TABLE ... ("binlog.enable" = "yes")` | the table is created
with binlog off |
| `ALTER TABLE t SET ("binlog.ttl_second" = "3600")` (typo) | `Nothing
is changed. please check your alter stmt.` |
| `CREATE TABLE ... ("binlog.ttl_second" = "3600")` | `Unknown
properties: {binlog.ttl_second=3600}` |
| `CREATE DATABASE d PROPERTIES ("binlog.ttl_second" = "3600")` |
succeeds; the key is persisted |
| `ALTER DATABASE d SET PROPERTIES ("binlog.max_byte" = "1024")` |
succeeds; the key is persisted |
| `ALTER DATABASE d SET PROPERTIES ("binlog.enable" = "1")` | succeeds;
`"1"` is persisted and read as false |

**How this PR fixes it.**
- `analyzeBinlogConfig` rejects any key under `binlog.` other than the
four with `Unknown binlog property: <key>`. The replaced `binlog.format`
and `binlog.need_historical_value` are still checked first, so they keep
their message that names the replacement.
- `binlog.enable` accepts only `true` or `false`, in any case, and
otherwise fails with the existing `Invalid binlog enable value:
<value>`, which the old `try` / `catch` around `Boolean.parseBoolean`
could never reach.
- CREATE TABLE runs this check on the properties as written, where it
only checked the replaced keys before. Its later call to
`analyzeBinlogConfig` sees the effective binlog config (the database
default merged with the table properties) that `createOlapTable` puts
back over them, and by then `"yes"` has already become `"false"`.
- Persisted metadata is not validated again: image load and edit log
replay read binlog properties through
`BinlogConfig.mergeFromProperties`, which is unchanged, so a database
that already stored such a key loads as before. A database's binlog
default reaches CREATE TABLE as a `BinlogConfig` object, not as
properties, so it does not make CREATE TABLE fail either.

**Results.**

| Statement | After |
|---|---|
| `ALTER TABLE t SET ("binlog.enable" = "yes")` | `Invalid binlog enable
value: yes`; `t` keeps its binlog setting |
| `CREATE TABLE ... ("binlog.enable" = "yes")` | `Invalid binlog enable
value: yes` |
| `ALTER TABLE` / `CREATE TABLE` / `CREATE DATABASE` with
`"binlog.ttl_second"` | `Unknown binlog property: binlog.ttl_second` |
| `ALTER DATABASE ... ("binlog.max_byte" = "1024")` | `Unknown binlog
property: binlog.max_byte` |
| `ALTER DATABASE ... ("binlog.enable" = "1")` | `Invalid binlog enable
value: 1` |
| `"binlog.enable" = "TRUE"` / `"False"` | accepted, stored as `true` /
`false` (unchanged) |
@morningman
morningman deleted the changelog-t1-rename branch October 22, 2026 10:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

approved Indicates a PR has been approved by one committer. incremental-computation reviewed

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants