sqruff_lib_core/dialects/
syntax.rs

1use std::iter::FromIterator;
2
3#[derive(
4    Debug,
5    PartialEq,
6    Eq,
7    Clone,
8    Copy,
9    strum_macros::IntoStaticStr,
10    strum_macros::EnumString,
11    Hash,
12    PartialOrd,
13    Ord,
14    Default,
15)]
16#[strum(serialize_all = "snake_case")]
17pub enum SyntaxKind {
18    Unparsable,
19    File,
20    ColumnReference,
21    ObjectReference,
22    Expression,
23    WildcardIdentifier,
24    Function,
25    HavingClause,
26    PathSegment,
27    LimitClause,
28    CubeRollupClause,
29    GroupingSetsClause,
30    GroupingExpressionList,
31    SetClause,
32    FetchClause,
33    FunctionDefinition,
34    AlterSequenceOptionsSegment,
35    RoleReference,
36    TablespaceReference,
37    ExtensionReference,
38    TagReference,
39    ColumnDefinition,
40    ColumnConstraintSegment,
41    CommentClause,
42    TableEndClause,
43    MergeMatch,
44    MergeWhenNotMatchedClause,
45    MergeInsertClause,
46    MergeUpdateClause,
47    MergeDeleteClause,
48    SetClauseList,
49    TableReference,
50    GroupbyClause,
51    FrameClause,
52    WithCompoundStatement,
53    CommonTableExpression,
54    CTEColumnList,
55    TriggerReference,
56    TableConstraint,
57    JoinOnCondition,
58    DatabaseReference,
59    CollationReference,
60    OverClause,
61    NamedWindow,
62    WindowSpecification,
63    PartitionbyClause,
64    JoinClause,
65    DropTriggerStatement,
66    SampleExpression,
67    TableExpression,
68    CreateTriggerStatement,
69    DropModelStatement,
70    DescribeStatement,
71    UseStatement,
72    ExplainStatement,
73    CreateSequenceStatement,
74    CreateSequenceOptionsSegment,
75    AlterSequenceStatement,
76    DropSequenceStatement,
77    DropCastStatement,
78    CreateFunctionStatement,
79    DropFunctionStatement,
80    CreateModelStatement,
81    CreateViewStatement,
82    DeleteStatement,
83    UpdateStatement,
84    CreateCastStatement,
85    CreateRoleStatement,
86    DropRoleStatement,
87    AlterTableStatement,
88    CreateSchemaStatement,
89    SetSchemaStatement,
90    DropSchemaStatement,
91    DropTypeStatement,
92    CreateDatabaseStatement,
93    DropDatabaseStatement,
94    FunctionParameterList,
95    CreateIndexStatement,
96    DropIndexStatement,
97    CreateTableStatement,
98    AccessStatement,
99    InsertStatement,
100    TransactionStatement,
101    DropTableStatement,
102    DropViewStatement,
103    CreateUserStatement,
104    DropUserStatement,
105    ArrayExpression,
106    LocalAlias,
107    MergeStatement,
108    IndexColumnDefinition,
109    AggregateOrderByClause,
110    FunctionName,
111    CaseExpression,
112    WhenClause,
113    ElseClause,
114    WhereClause,
115    SetOperator,
116    ValuesClause,
117    EmptyStructLiteral,
118    ObjectLiteral,
119    ObjectLiteralElement,
120    TimeZoneGrammar,
121    BracketedArguments,
122    DataType,
123    AliasExpression,
124    ArrayAccessor,
125    ArrayLiteral,
126    TypedArrayLiteral,
127    StructType,
128    StructLiteral,
129    TypedStructLiteral,
130    IntervalExpression,
131    ArrayType,
132    SizedArrayType,
133    SelectStatement,
134    OverlapsClause,
135    SelectClause,
136    Statement,
137    WithNoSchemaBindingClause,
138    WithDataClause,
139    SetExpression,
140    FromClause,
141    EmptyStructLiteralBrackets,
142    WildcardExpression,
143    OrderbyClause,
144    TruncateStatement,
145    FromExpression,
146    FromExpressionElement,
147    SelectClauseModifier,
148    NamedWindowExpression,
149    SelectClauseElement,
150    QualifyClause,
151    MultiStatementSegment,
152    AssertStatement,
153    ForInStatements,
154    ForInStatement,
155    RepeatStatements,
156    RepeatStatement,
157    IfStatements,
158    IfStatement,
159    LoopStatements,
160    LoopStatement,
161    WhileStatements,
162    WhileStatement,
163    DatePartWeek,
164    SelectExceptClause,
165    SelectReplaceClause,
166    StructTypeSchema,
167    Tuple,
168    NamedArgument,
169    DeclareSegment,
170    SetSegment,
171    PartitionBySegment,
172    ClusterBySegment,
173    OptionsSegment,
174    CreateExternalTableStatement,
175    AlterViewStatement,
176    CreateMaterializedViewStatement,
177    AlterMaterializedViewSetOptionsStatement,
178    DropMaterializedViewStatement,
179    ParameterizedExpression,
180    PivotForClause,
181    FromPivotExpression,
182    UnpivotClause,
183    FromUnpivotExpression,
184    NotMatchedByTargetClause,
185    MergeWhenMatchedClause,
186    ProcedureName,
187    ExportStatement,
188    ProcedureParameterList,
189    ProcedureStatements,
190    CallStatement,
191    ReturnStatement,
192    BreakStatement,
193    LeaveStatement,
194    ContinueStatement,
195    RaiseStatement,
196    PsqlVariable,
197    ComparisonOperator,
198    DatetimeTypeIdentifier,
199    DatetimeLiteral,
200    IndexAccessMethod,
201    OperatorClassReference,
202    DefinitionParameter,
203    DefinitionParameters,
204    RelationOption,
205    RelationOptions,
206    AlterFunctionActionSegment,
207    AlterProcedureActionSegment,
208    AlterProcedureStatement,
209    DropProcedureStatement,
210    WktGeometryType,
211    IntoClause,
212    ForClause,
213    AlterRoleStatement,
214    ExplainOption,
215    CreateTableAsStatement,
216    AlterPublicationStatement,
217    CreatePublicationStatement,
218    PublicationObjects,
219    PublicationTable,
220    PublicationReference,
221    DropExtensionStatement,
222    CreateExtensionStatement,
223    VersionIdentifier,
224    AlterTableActionSegment,
225    DropPublicationStatement,
226    AlterMaterializedViewStatement,
227    AlterMaterializedViewActionSegment,
228    RefreshMaterializedViewStatement,
229    WithCheckOption,
230    AlterPolicyStatement,
231    AlterDatabaseStatement,
232    VacuumStatement,
233    LikeOptionSegment,
234    PartitionBoundSpec,
235    IndexParameters,
236    ReferentialActionSegment,
237    IndexElement,
238    ExclusionConstraintElement,
239    AlterDefaultPrivilegesStatement,
240    AlterDefaultPrivilegesObjectPrivilege,
241    AlterDefaultPrivilegesSchemaObject,
242    AlterDefaultPrivilegesToFromRoles,
243    AlterDefaultPrivilegesGrant,
244    DropOwnedStatement,
245    ReassignOwnedStatement,
246    IndexElementOptions,
247    AlterDefaultPrivilegesRevoke,
248    AlterIndexStatement,
249    ReindexStatementSegment,
250    AnalyzeStatement,
251    AlterTrigger,
252    OperationClassReference,
253    ConflictAction,
254    ConflictTarget,
255    SetStatement,
256    CreatePolicyStatement,
257    CreateDomainStatement,
258    AlterDomainStatement,
259    DropDomainStatement,
260    DropPolicyStatement,
261    LoadStatement,
262    ResetStatement,
263    ListenStatement,
264    NotifyStatement,
265    UnlistenStatement,
266    ClusterStatement,
267    LanguageClause,
268    DoStatement,
269    CreateUserMappingStatement,
270    ImportForeignSchemaStatement,
271    CreateServerStatement,
272    CreateCollationStatement,
273    AlterTypeStatement,
274    CreateTypeStatement,
275    LockTableStatement,
276    CopyStatement,
277    DiscardStatement,
278    AlterSchemaStatement,
279    ServerReference,
280    ArrayJoinClause,
281    TableEngineFunction,
282    OnClusterClause,
283    Engine,
284    EngineFunction,
285    DatabaseEngine,
286    ColumnTtlSegment,
287    TableTtlSegment,
288    DropDictionaryStatement,
289    DropQuotaStatement,
290    DropSettingProfileStatement,
291    SystemMergesSegment,
292    SystemTtlMergesSegment,
293    SystemMovesSegment,
294    SystemReplicaSegment,
295    SystemFilesystemSegment,
296    SystemReplicatedSegment,
297    SystemReplicationSegment,
298    SystemFetchesSegment,
299    SystemDistributedSegment,
300    SystemModelSegment,
301    SystemFileSegment,
302    SystemUnfreezeSegment,
303    SystemStatement,
304    ConnectbyClause,
305    CallSegment,
306    WithingroupClause,
307    PatternExpression,
308    MatchRecognizeClause,
309    ChangesClause,
310    FromAtExpression,
311    FromBeforeExpression,
312    SnowflakeKeywordExpression,
313    SemiStructuredExpression,
314    SelectExcludeClause,
315    SelectRenameClause,
316    AlterTableTableColumnAction,
317    AlterTableClusteringAction,
318    AlterTableConstraintAction,
319    AlterWarehouseStatement,
320    AlterShareStatement,
321    AlterStorageIntegrationStatement,
322    AlterExternalTableStatement,
323    CommentEqualsClause,
324    TagBracketedEquals,
325    TagEquals,
326    CreateCloneStatement,
327    CreateDatabaseFromShareStatement,
328    CreateProcedureStatement,
329    ScriptingBlockStatement,
330    ScriptingLetStatement,
331    AlterFunctionStatement,
332    CreateExternalFunctionStatement,
333    WarehouseObjectProperties,
334    ConstraintPropertiesSegment,
335    CopyOptions,
336    SchemaObjectProperties,
337    CreateTaskStatement,
338    SnowflakeTaskExpressionSegment,
339    CreateStatement,
340    CreateFileFormatSegment,
341    AlterFileFormatSegment,
342    CsvFileFormatTypeParameters,
343    JsonFileFormatTypeParameters,
344    AvroFileFormatTypeParameters,
345    OrcFileFormatTypeParameters,
346    ParquetFileFormatTypeParameters,
347    XmlFileFormatTypeParameters,
348    AlterPipeSegment,
349    FileFormatSegment,
350    FormatTypeOptions,
351    CopyIntoLocationStatement,
352    CopyIntoTableStatement,
353    StorageLocation,
354    StageParameters,
355    S3ExternalStageParameters,
356    GcsExternalStageParameters,
357    AzureBlobStorageExternalStageParameters,
358    CreateStageStatement,
359    AlterStageStatement,
360    CreateStreamStatement,
361    AlterStreamStatement,
362    ShowStatement,
363    AlterUserStatement,
364    AlterSessionStatement,
365    AlterSessionSetStatement,
366    AlterSessionUnsetClause,
367    AlterTaskStatement,
368    AlterTaskSpecialSetClause,
369    AlterTaskSetClause,
370    AlterTaskUnsetClause,
371    ExecuteTaskClause,
372    UndropStatement,
373    CommentStatement,
374    DropExternalTableStatement,
375    ListStatement,
376    GetStatement,
377    PutStatement,
378    RemoveStatement,
379    CastExpression,
380    DropObjectStatement,
381    UnsetStatement,
382    SqlConfOption,
383    BinaryOperator,
384    PrimitiveType,
385    CreateWidgetStatement,
386    ReplaceTableStatement,
387    RemoveWidgetStatement,
388    UseDatabaseStatement,
389    InsertOverwriteDirectoryStatement,
390    InsertOverwriteDirectoryHiveFmtStatement,
391    LoadDataStatement,
392    ClusterByClause,
393    DistributeByClause,
394    HintFunction,
395    SelectHint,
396    WithCubeRollupClause,
397    SortByClause,
398    LateralViewClause,
399    PivotClause,
400    TransformClause,
401    AddFileStatement,
402    AddJarStatement,
403    AnalyzeTableStatement,
404    CacheTable,
405    ClearCache,
406    ListFileStatement,
407    ListJarStatement,
408    RefreshStatement,
409    UncacheTable,
410    FileReference,
411    PropertyNameIdentifier,
412    GeneratedColumnDefinition,
413    IntervalLiteral,
414    DescribeHistoryStatement,
415    DescribeDetailStatement,
416    GenerateManifestFileStatement,
417    ConvertToDeltaStatement,
418    RestoreTableStatement,
419    ConstraintStatement,
420    ApplyChangesIntoStatement,
421    UsingClause,
422    DataSourceFormat,
423    IcebergTransformation,
424    MsckRepairTableStatement,
425    RowFormatClause,
426    SkewedByClause,
427    Bracketed,
428    NumericLiteral,
429    Keyword,
430    EndOfFile,
431    Whitespace,
432    Newline,
433    NakedIdentifier,
434    Unlexable,
435    StartBracket,
436    EndBracket,
437    InlineComment,
438    Identifier,
439    Raw,
440    QuotedIdentifier,
441    Star,
442    Dot,
443    Comma,
444    Comment,
445    EmitsSegment,
446    Literal,
447    BareFunction,
448    NullLiteral,
449    BooleanLiteral,
450    BlockComment,
451    QuotedLiteral,
452    DoubleDivide,
453    Meta,
454    #[default]
455    Colon,
456    StatementTerminator,
457    StartSquareBracket,
458    EndSquareBracket,
459    StartCurlyBracket,
460    Tilde,
461    CastingOperator,
462    RawComparisonOperator,
463    DatePart,
464    Pipe,
465    SignIndicator,
466    LikeOperator,
467    Word,
468    DoubleQuote,
469    SingleQuote,
470    Dash,
471    Semicolon,
472    BackQuote,
473    DollarQuote,
474    Not,
475    Ampersand,
476    Question,
477    Percent,
478    Divide,
479    Minus,
480    Plus,
481    Caret,
482    VerticalBar,
483    EndCurlyBracket,
484    FunctionNameIdentifier,
485    Dedent,
486    Indent,
487    Implicit,
488    AtSignLiteral,
489    TsqlVariable,
490    QuestionMark,
491    RightArrow,
492    UdfBody,
493    StartAngleBracket,
494    EndAngleBracket,
495    Lambda,
496    NakedIdentifierAll,
497    ProcedureNameIdentifier,
498    Parameter,
499    DateConstructorLiteral,
500    ProcedureOption,
501    ExportOption,
502    PropertiesNakedIdentifier,
503    Symbol,
504    DataTypeIdentifier,
505    Placeholder,
506    ExecuteScriptStatement,
507    AssignmentOperator,
508    Batch,
509    PivotColumnReference,
510    IntoTableClause,
511    PasswordAuth,
512    ExecuteAsClause,
513    UnicodeSingleQuote,
514    EscapedSingleQuote,
515    UnicodeDoubleQuote,
516    JsonOperator,
517    At,
518    BitStringLiteral,
519    DollarNumericLiteral,
520    WidgetNameIdentifier,
521    FileKeyword,
522    SemiStructuredElement,
523    BytesDoubleQuote,
524    BytesSingleQuote,
525    FileFormat,
526    FileType,
527    StartHint,
528    EndHint,
529    FunctionAssigner,
530    UnquotedFilePath,
531    Dollar,
532    SystemFunctionName,
533    IntegerLiteral,
534    StageEncryptionOption,
535    BucketPath,
536    QuotedStar,
537    StagePath,
538    FileLiteral,
539    BytesQuotedLiteral,
540    SignedQuotedLiteral,
541    ParameterAssigner,
542    ColumnSelector,
543    DollarLiteral,
544    ExcludeBracketClose,
545    WalrusOperator,
546    WarehouseSize,
547    Variable,
548    ExcludeBracketOpen,
549    SymlinkFormatManifest,
550    StartExcludeBracket,
551    CompressionType,
552    CopyOnErrorOption,
553    ColumnIndexIdentifierSegment,
554    ScalingPolicy,
555    ValidationModeOption,
556    EndExcludeBracket,
557    IdentifierList,
558    TemplateLoop,
559    ColonDelimiter,
560    SqlcmdOperator,
561    Slice,
562    TableEndClauseSegment,
563    PragmaStatement,
564    PragmaReference,
565    Slash,
566    DataFormatSegment,
567    AuthorizationSegment,
568    ColumnAttributeSegment,
569    ShowModelStatement,
570    CreateExternalSchemaStatement,
571    CreateLibraryStatement,
572    UnloadStatement,
573    DeclareStatement,
574    FetchStatement,
575    CloseStatement,
576    CreateDatashareStatement,
577    DescDatashareStatement,
578    DropDatashareStatement,
579    ShowDatasharesStatement,
580    GrantDatashareStatement,
581    CreateRlsPolicyStatement,
582    ManageRlsPolicyStatement,
583    DropRlsPolicyStatement,
584    AnalyzeCompressionStatement,
585    PartitionedBySegment,
586    RowFormatDelimitedSegment,
587    ObjectUnpivoting,
588    ArrayUnnesting,
589    AlterGroup,
590    CreateGroup,
591    ListaggOverflowClauseSegment,
592    UnorderedSelectStatementSegment,
593    MapType,
594    MapTypeSchema,
595    PrepareStatement,
596    ExecuteStatement,
597}
598
599impl SyntaxKind {
600    pub fn indent_val(self) -> i8 {
601        match self {
602            SyntaxKind::Indent | SyntaxKind::Implicit => 1,
603            SyntaxKind::Dedent => -1,
604            _ => 0,
605        }
606    }
607}
608
609impl SyntaxKind {
610    pub fn as_str(&self) -> &'static str {
611        self.into()
612    }
613}
614
615#[derive(Clone, PartialEq, Eq, Default)]
616pub struct SyntaxSet([u64; 10]);
617
618impl std::fmt::Debug for SyntaxSet {
619    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
620        f.debug_list().entries(self.iter()).finish()
621    }
622}
623
624impl SyntaxSet {
625    pub const EMPTY: SyntaxSet = Self([0; 10]);
626    const SLICE_BITS: u16 = u64::BITS as u16;
627
628    pub const fn new(kinds: &[SyntaxKind]) -> Self {
629        let mut set = SyntaxSet::EMPTY;
630
631        let mut index = 0;
632        while index < kinds.len() {
633            set = set.union(&Self::single(kinds[index]));
634            index += 1;
635        }
636
637        set
638    }
639
640    pub const fn single(kind: SyntaxKind) -> Self {
641        let kind = kind as u16;
642
643        let index = (kind / Self::SLICE_BITS) as usize;
644
645        debug_assert!(
646            index < Self::EMPTY.0.len(),
647            "Index out of bounds. Increase the size of the bitset array."
648        );
649
650        let shift = kind % Self::SLICE_BITS;
651        let mask = 1 << shift;
652
653        let mut bits = Self::EMPTY.0;
654        bits[index] = mask;
655
656        Self(bits)
657    }
658
659    pub fn is_empty(&self) -> bool {
660        self == &SyntaxSet::EMPTY
661    }
662
663    pub fn insert(&mut self, value: SyntaxKind) {
664        let set = std::mem::take(self);
665        *self = set.union(&SyntaxSet::single(value));
666    }
667
668    pub const fn intersection(mut self, other: &Self) -> Self {
669        let mut index = 0;
670
671        while index < self.0.len() {
672            self.0[index] &= other.0[index];
673            index += 1;
674        }
675
676        self
677    }
678
679    pub const fn union(mut self, other: &Self) -> Self {
680        let mut i = 0;
681
682        while i < self.0.len() {
683            self.0[i] |= other.0[i];
684            i += 1;
685        }
686
687        self
688    }
689
690    pub const fn intersects(&self, other: &Self) -> bool {
691        let mut i = 0;
692
693        while i < self.0.len() {
694            if self.0[i] & other.0[i] != 0 {
695                return true;
696            }
697            i += 1;
698        }
699
700        false
701    }
702
703    pub const fn contains(&self, kind: SyntaxKind) -> bool {
704        let kind = kind as u16;
705        let index = kind as usize / Self::SLICE_BITS as usize;
706        let shift = kind % Self::SLICE_BITS;
707        let mask = 1 << shift;
708
709        self.0[index] & mask != 0
710    }
711
712    pub const fn len(&self) -> usize {
713        let mut len: u32 = 0;
714
715        let mut index = 0;
716        while index < self.0.len() {
717            len += self.0[index].count_ones();
718            index += 1;
719        }
720
721        len as usize
722    }
723
724    pub fn iter(&self) -> SyntaxSetIter {
725        SyntaxSetIter {
726            set: self.clone(),
727            index: 0,
728        }
729    }
730}
731
732impl Extend<SyntaxKind> for SyntaxSet {
733    fn extend<T: IntoIterator<Item = SyntaxKind>>(&mut self, iter: T) {
734        let set = std::mem::take(self);
735        *self = set.union(&SyntaxSet::from_iter(iter));
736    }
737}
738
739impl IntoIterator for SyntaxSet {
740    type Item = SyntaxKind;
741    type IntoIter = SyntaxSetIter;
742
743    fn into_iter(self) -> Self::IntoIter {
744        self.iter()
745    }
746}
747
748impl IntoIterator for &SyntaxSet {
749    type Item = SyntaxKind;
750    type IntoIter = SyntaxSetIter;
751
752    fn into_iter(self) -> Self::IntoIter {
753        self.iter()
754    }
755}
756
757impl FromIterator<SyntaxKind> for SyntaxSet {
758    fn from_iter<T: IntoIterator<Item = SyntaxKind>>(iter: T) -> Self {
759        let mut set = SyntaxSet::EMPTY;
760
761        for kind in iter {
762            set.insert(kind);
763        }
764
765        set
766    }
767}
768
769pub struct SyntaxSetIter {
770    set: SyntaxSet,
771    index: u16,
772}
773
774impl Iterator for SyntaxSetIter {
775    type Item = SyntaxKind;
776
777    fn next(&mut self) -> Option<Self::Item> {
778        loop {
779            let slice = self.set.0.get_mut(self.index as usize)?;
780            let bit = slice.trailing_zeros() as u16;
781
782            if bit < SyntaxSet::SLICE_BITS {
783                *slice ^= 1 << bit;
784                let value = self.index * SyntaxSet::SLICE_BITS + bit;
785                return Some(unsafe { std::mem::transmute::<u16, SyntaxKind>(value) });
786            }
787
788            self.index += 1;
789        }
790    }
791
792    fn size_hint(&self) -> (usize, Option<usize>) {
793        let len = self.set.len();
794
795        (len, Some(len))
796    }
797}