CREATE TABLE: SPARSE MASKED WITH (...) column order (per MS docs) fails to parse; reversed order parses fine
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 3/5
- Tempo stimato
- 1-2 giorni
- Idoneità per principianti
- 75/100
Direzione di ricerca
Inizia con la grammatica di column_definition e riproduci il problema usando TSql160Parser e l’istruzione CREATE TABLE minima. Confronta l’ordine documentato SPARSE MASKED con l’ordine invertito che funziona già nelle versioni del parser interessate. Il lavoro è completo quando l’ordine documentato viene analizzato con zero errori e il comportamento esistente continua a essere coperto.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Summary
CREATE TABLE column definitions that combine SPARSE and MASKED WITH (FUNCTION = ...) fail to parse (Incorrect syntax near 'MASKED') when the clauses appear in the order documented by Microsoft's own T-SQL reference (COLLATE → SPARSE → MASKED WITH). The reversed, non-standard order (MASKED WITH (...) before SPARSE) parses without error. This looks like an order-handling gap in the column_definition grammar rather than a missing feature — both SPARSE and MASKED WITH are individually well supported.
Repro
CREATE TABLE t (
c varchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS SPARSE MASKED WITH (FUNCTION = 'default()') NULL
);
Minimal reduction (no COLLATE needed):
CREATE TABLE t (c varchar(100) SPARSE MASKED WITH (FUNCTION = 'default()') NULL);
TSql160Parser parser = new(initialQuotedIdentifiers: true);
using StringReader reader = new(sql);
TSqlFragment fragment = parser.Parse(reader, out IList<ParseError> errors);
// errors.Count == 1
// errors[0].Message == "Incorrect syntax near 'MASKED'."
Swapping the clause order makes the identical statement parse cleanly:
CREATE TABLE t (c varchar(100) MASKED WITH (FUNCTION = 'default()') SPARSE NULL);
-- errors.Count == 0
Per the official CREATE TABLE grammar reference (https://learn.microsoft.com/en-us/sql/t-sql/statements/create-table-transact-sql), the documented <column_definition> order is:
column_name <data_type>
[ FILESTREAM ]
[ COLLATE collation_name ]
[ SPARSE ]
[ MASKED WITH ( FUNCTION = 'mask_function' ) ]
...
i.e. SPARSE before MASKED WITH. That documented order is exactly the order that fails to parse.
Scope tested
Parser classes (package version 180.37.3) — tested all concrete TSqlParser subclasses against the repro:
| Parser | Result |
|---|---|
TSql80Parser / TSql90Parser |
fails on SPARSE itself (expected — predates the feature) |
TSql100Parser / TSql110Parser / TSql120Parser |
Expected FILESTREAM but encountered MASKED instead. |
TSql130Parser … TSql180Parser |
Incorrect syntax near 'MASKED'. |
TSqlFabricDWParser |
Incorrect syntax near 'MASKED'. |
Every parser class from TSql100Parser onward (i.e. every version where MASKED is otherwise supported) rejects the SPARSE MASKED WITH (...) ordering.
Package versions — reproduced with the default (TSql160Parser)/latest-appropriate parser across every published version from 170.3.0 through the current latest:
170.3.0, 170.12.0, 170.64.0, 170.121.2, 170.157.0, 170.191.0, 180.6.0, 180.18.1, 180.37.3
All affected, no regression/fix in any tested version.
Expected behavior
COLLATE ... SPARSE MASKED WITH (FUNCTION = ...) — the order documented in Microsoft's own T-SQL reference, and valid, functioning DDL against a real SQL Server / Azure SQL instance — should parse without error, matching the already-working reversed order.
Additional notes
- Searched existing issues for
MASKED,SPARSE, and combinations thereof; found no duplicate. - Encountered this while building a T-SQL static-analysis tool against a real-world database schema using Dynamic Data Masking on sparse columns (a documented, supported SQL Server feature combination).
- Lingua principale
- GAP
- Stelle
- 277
- Fork
- 43
- Merge medio
- 6g 17h
- PR unite (30g)
- 3
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di microsoft/SqlScriptDOM
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 84/100
microsoft/SqlScriptDOM#228 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 62/100
microsoft/SqlScriptDOM#183 ·
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 56/100
microsoft/SqlScriptDOM#226 · 1 reazione ·
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 48/100
microsoft/SqlScriptDOM#225 ·
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 58/100
microsoft/SqlScriptDOM#224 ·
Tutte le issue di microsoft/SqlScriptDOM
Issue simili
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 86/100
objectionary/jeo-maven-plugin#1774 ·
-
compiler/runtime
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 84/100
leanprover/lean4#15255 ·
-
bot-triaged module: correctness (silent) module: fx release triage triage review
Difficoltà 2/5 1-3 ore Idoneità per principianti 86/100
-
Grammar Gap: activated › effect clause › {self} deals damage equal to its power to target creature Apertaarea:mechanics ready-for-agent
Difficoltà 2/5 1-3 ore Idoneità per principianti 74/100
fil-donadoni/tolaria#4317 ·