A table.include.list entry that matches no table is raised, with the corrected entry when the mistake is a missing schema or a shell glob - #13
Merged
Conversation
This was referenced Sep 25, 2026
…corrected entry when the mistake is a missing schema or a shell glob Debezium logs a warning when a table.include.list entry matches nothing and keeps running, so the topic is simply never produced. People ask it to fail instead (debezium/dbz#872); a maintainer answered that a table may be created later. cdclint raises it as a warning for the same reason: when a sink actually reads the table, sink-table-not-captured already fails the pull request. The two shapes behind the most-viewed questions get a pointed fix, because both follow from Debezium's documented matching (each entry is a regular expression matched against the whole schema.table name): an entry without its schema (Stack Overflow 74103659: ipaddrs for myschema.ipaddrs) gets "write myschema\.ipaddrs", and a shell glob (Stack Overflow 51345636: public.bg_* names no table as a regex) gets "write public\.bg_.* to capture ..." with the tables it would capture. An entry that already contains .* is read as the regex it is. Exclude-list entries are not checked: one that matches nothing excludes nothing, the same reasoning as captured-column-missing. Three corpus entries, written before the code: include-table-no-schema, include-table-glob, include-table-typo.
avison9
force-pushed
the
feat/captured-table-missing
branch
from
September 25, 2026 22:24
610bec0 to
cf0363a
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What it changes
A new rule,
captured-table-missing(warning): eachtable.include.listentry (or the oldtable.whitelistspelling) is checked against the tables in the migrations, and an entry that matches none is raised on the connector file.Two shapes get the corrected entry as the fix, because they are how people get it wrong in practice and both follow from Debezium's documented matching (each entry is a regular expression matched against the whole
schema.tablename, never a substring):Anything else gets the plain fix: remove it, or check the spelling against the migrations.
Why a warning, not an error
Debezium itself only logs a warning here and keeps running. debezium/dbz#872 asks it to fail; a maintainer answered that a table may be created later, which is a legitimate case a linter reading migrations cannot rule out. When a sink actually reads the table, the existing
sink-table-not-capturederror still fails the pull request, as all three new corpus entries show.What was rejected
captured-column-missing..*as a glob: it was written as a regular expression, and rewriting it would be a guess.Verified
include-table-no-schema(reduced from Stack Overflow 74103659, 6.9k views),include-table-glob(Stack Overflow 51345636, 5.9k views),include-table-typo. The expectations were written by hand and failed before the code; they pass as written. Every existing corpus entry is unchanged (no-update).gofmt -l .clean,go vet ./...,go build ./...,go test ./...pass.1986043:0 error(s), 0 warning(s), 159 info, unchanged, so no false positive on a real pipeline.public.reportschanged toreports: the rule raisesreports ... matches no table, suggestspublic\.reports, and the existing error shows the consequence in the real sink.Docs
README: the rule in the rules table (marked
nextuntil it is released), and the symptom rows fortable.include.list not workingand a table-list typo now name it. corpus/README: the three entries.Next for you
Merge when happy. It ships in the next release tag.