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    MatchConditionClause,
311    FromAtExpression,
312    FromBeforeExpression,
313    SnowflakeKeywordExpression,
314    SemiStructuredExpression,
315    SelectExcludeClause,
316    SelectRenameClause,
317    AlterTableTableColumnAction,
318    AlterTableClusteringAction,
319    AlterTableConstraintAction,
320    AlterWarehouseStatement,
321    AlterShareStatement,
322    AlterStorageIntegrationStatement,
323    AlterExternalTableStatement,
324    CommentEqualsClause,
325    TagBracketedEquals,
326    TagEquals,
327    CreateCloneStatement,
328    CreateDatabaseFromShareStatement,
329    CreateProcedureStatement,
330    ScriptingBlockStatement,
331    ScriptingLetStatement,
332    AlterFunctionStatement,
333    CreateExternalFunctionStatement,
334    WarehouseObjectProperties,
335    ConstraintPropertiesSegment,
336    CopyOptions,
337    SchemaObjectProperties,
338    CreateTaskStatement,
339    SnowflakeTaskExpressionSegment,
340    CreateStatement,
341    CreateFileFormatSegment,
342    AlterFileFormatSegment,
343    CsvFileFormatTypeParameters,
344    JsonFileFormatTypeParameters,
345    AvroFileFormatTypeParameters,
346    OrcFileFormatTypeParameters,
347    ParquetFileFormatTypeParameters,
348    XmlFileFormatTypeParameters,
349    AlterPipeSegment,
350    FileFormatSegment,
351    FormatTypeOptions,
352    CopyIntoLocationStatement,
353    CopyIntoTableStatement,
354    StorageLocation,
355    StageParameters,
356    S3ExternalStageParameters,
357    GcsExternalStageParameters,
358    AzureBlobStorageExternalStageParameters,
359    CreateStageStatement,
360    AlterStageStatement,
361    CreateStreamStatement,
362    AlterStreamStatement,
363    ShowStatement,
364    AlterUserStatement,
365    AlterSessionStatement,
366    AlterSessionSetStatement,
367    AlterSessionUnsetClause,
368    AlterTaskStatement,
369    AlterTaskSpecialSetClause,
370    AlterTaskSetClause,
371    AlterTaskUnsetClause,
372    ExecuteTaskClause,
373    UndropStatement,
374    CommentStatement,
375    DropExternalTableStatement,
376    ListStatement,
377    GetStatement,
378    PutStatement,
379    RemoveStatement,
380    CastExpression,
381    DropObjectStatement,
382    UnsetStatement,
383    SqlConfOption,
384    BinaryOperator,
385    PrimitiveType,
386    CreateWidgetStatement,
387    ReplaceTableStatement,
388    RemoveWidgetStatement,
389    UseDatabaseStatement,
390    InsertOverwriteDirectoryStatement,
391    InsertOverwriteDirectoryHiveFmtStatement,
392    LoadDataStatement,
393    ClusterByClause,
394    DistributeByClause,
395    HintFunction,
396    SelectHint,
397    WithCubeRollupClause,
398    SortByClause,
399    LateralViewClause,
400    PivotClause,
401    TransformClause,
402    AddFileStatement,
403    AddJarStatement,
404    AnalyzeTableStatement,
405    CacheTable,
406    ClearCache,
407    ListFileStatement,
408    ListJarStatement,
409    RefreshStatement,
410    UncacheTable,
411    FileReference,
412    PropertyNameIdentifier,
413    GeneratedColumnDefinition,
414    IntervalLiteral,
415    DescribeHistoryStatement,
416    DescribeDetailStatement,
417    GenerateManifestFileStatement,
418    ConvertToDeltaStatement,
419    RestoreTableStatement,
420    ConstraintStatement,
421    ApplyChangesIntoStatement,
422    UsingClause,
423    DataSourceFormat,
424    IcebergTransformation,
425    MsckRepairTableStatement,
426    RowFormatClause,
427    SkewedByClause,
428    Bracketed,
429    NumericLiteral,
430    Keyword,
431    EndOfFile,
432    Whitespace,
433    Newline,
434    NakedIdentifier,
435    Unlexable,
436    StartBracket,
437    EndBracket,
438    InlineComment,
439    Identifier,
440    Raw,
441    QuotedIdentifier,
442    Star,
443    Dot,
444    Comma,
445    Comment,
446    EmitsSegment,
447    Literal,
448    BareFunction,
449    NullLiteral,
450    BooleanLiteral,
451    BlockComment,
452    QuotedLiteral,
453    DoubleDivide,
454    Meta,
455    #[default]
456    Colon,
457    StatementTerminator,
458    StartSquareBracket,
459    EndSquareBracket,
460    StartCurlyBracket,
461    Tilde,
462    CastingOperator,
463    RawComparisonOperator,
464    DatePart,
465    Pipe,
466    SignIndicator,
467    LikeOperator,
468    Word,
469    DoubleQuote,
470    SingleQuote,
471    Dash,
472    Semicolon,
473    BackQuote,
474    DollarQuote,
475    Not,
476    Ampersand,
477    Question,
478    Percent,
479    Divide,
480    Minus,
481    Plus,
482    Caret,
483    VerticalBar,
484    EndCurlyBracket,
485    FunctionNameIdentifier,
486    Dedent,
487    Indent,
488    Implicit,
489    AtSignLiteral,
490    TsqlVariable,
491    QuestionMark,
492    RightArrow,
493    UdfBody,
494    StartAngleBracket,
495    EndAngleBracket,
496    Lambda,
497    NakedIdentifierAll,
498    ProcedureNameIdentifier,
499    Parameter,
500    DateConstructorLiteral,
501    ProcedureOption,
502    ExportOption,
503    PropertiesNakedIdentifier,
504    Symbol,
505    DataTypeIdentifier,
506    Placeholder,
507    ExecuteScriptStatement,
508    AssignmentOperator,
509    Batch,
510    PivotColumnReference,
511    IntoTableClause,
512    PasswordAuth,
513    ExecuteAsClause,
514    UnicodeSingleQuote,
515    EscapedSingleQuote,
516    UnicodeDoubleQuote,
517    JsonOperator,
518    At,
519    BitStringLiteral,
520    DollarNumericLiteral,
521    WidgetNameIdentifier,
522    FileKeyword,
523    SemiStructuredElement,
524    BytesDoubleQuote,
525    BytesSingleQuote,
526    FileFormat,
527    FileType,
528    StartHint,
529    EndHint,
530    FunctionAssigner,
531    UnquotedFilePath,
532    Dollar,
533    SystemFunctionName,
534    IntegerLiteral,
535    StageEncryptionOption,
536    BucketPath,
537    QuotedStar,
538    StagePath,
539    FileLiteral,
540    BytesQuotedLiteral,
541    SignedQuotedLiteral,
542    ParameterAssigner,
543    ColumnSelector,
544    DollarLiteral,
545    ExcludeBracketClose,
546    WalrusOperator,
547    WarehouseSize,
548    Variable,
549    ExcludeBracketOpen,
550    SymlinkFormatManifest,
551    StartExcludeBracket,
552    CompressionType,
553    CopyOnErrorOption,
554    ColumnIndexIdentifierSegment,
555    ScalingPolicy,
556    ValidationModeOption,
557    EndExcludeBracket,
558    IdentifierList,
559    TemplateLoop,
560    ColonDelimiter,
561    SqlcmdOperator,
562    Slice,
563    TableEndClauseSegment,
564    PragmaStatement,
565    PragmaReference,
566    Slash,
567    DataFormatSegment,
568    AuthorizationSegment,
569    ColumnAttributeSegment,
570    ShowModelStatement,
571    CreateExternalSchemaStatement,
572    CreateLibraryStatement,
573    UnloadStatement,
574    DeclareStatement,
575    FetchStatement,
576    CloseStatement,
577    CreateDatashareStatement,
578    DescDatashareStatement,
579    DropDatashareStatement,
580    ShowDatasharesStatement,
581    GrantDatashareStatement,
582    CreateRlsPolicyStatement,
583    ManageRlsPolicyStatement,
584    DropRlsPolicyStatement,
585    AnalyzeCompressionStatement,
586    PartitionedBySegment,
587    RowFormatDelimitedSegment,
588    ObjectUnpivoting,
589    ArrayUnnesting,
590    AlterGroup,
591    CreateGroup,
592    ListaggOverflowClauseSegment,
593    UnorderedSelectStatementSegment,
594    MapType,
595    MapTypeSchema,
596    PrepareStatement,
597    ExecuteStatement,
598}
599
600impl SyntaxKind {
601    pub fn indent_val(self) -> i8 {
602        match self {
603            SyntaxKind::Indent | SyntaxKind::Implicit => 1,
604            SyntaxKind::Dedent => -1,
605            _ => 0,
606        }
607    }
608}
609
610impl SyntaxKind {
611    pub fn as_str(&self) -> &'static str {
612        self.into()
613    }
614}
615
616#[derive(Clone, PartialEq, Eq, Default)]
617pub struct SyntaxSet([u64; 10]);
618
619impl std::fmt::Debug for SyntaxSet {
620    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
621        f.debug_list().entries(self.iter()).finish()
622    }
623}
624
625impl SyntaxSet {
626    pub const EMPTY: SyntaxSet = Self([0; 10]);
627    const SLICE_BITS: u16 = u64::BITS as u16;
628
629    pub const fn new(kinds: &[SyntaxKind]) -> Self {
630        let mut set = SyntaxSet::EMPTY;
631
632        let mut index = 0;
633        while index < kinds.len() {
634            set = set.union(&Self::single(kinds[index]));
635            index += 1;
636        }
637
638        set
639    }
640
641    pub const fn single(kind: SyntaxKind) -> Self {
642        let kind = kind as u16;
643
644        let index = (kind / Self::SLICE_BITS) as usize;
645
646        debug_assert!(
647            index < Self::EMPTY.0.len(),
648            "Index out of bounds. Increase the size of the bitset array."
649        );
650
651        let shift = kind % Self::SLICE_BITS;
652        let mask = 1 << shift;
653
654        let mut bits = Self::EMPTY.0;
655        bits[index] = mask;
656
657        Self(bits)
658    }
659
660    pub fn is_empty(&self) -> bool {
661        self == &SyntaxSet::EMPTY
662    }
663
664    pub fn insert(&mut self, value: SyntaxKind) {
665        let set = std::mem::take(self);
666        *self = set.union(&SyntaxSet::single(value));
667    }
668
669    pub const fn intersection(mut self, other: &Self) -> Self {
670        let mut index = 0;
671
672        while index < self.0.len() {
673            self.0[index] &= other.0[index];
674            index += 1;
675        }
676
677        self
678    }
679
680    pub const fn union(mut self, other: &Self) -> Self {
681        let mut i = 0;
682
683        while i < self.0.len() {
684            self.0[i] |= other.0[i];
685            i += 1;
686        }
687
688        self
689    }
690
691    pub const fn intersects(&self, other: &Self) -> bool {
692        let mut i = 0;
693
694        while i < self.0.len() {
695            if self.0[i] & other.0[i] != 0 {
696                return true;
697            }
698            i += 1;
699        }
700
701        false
702    }
703
704    pub const fn contains(&self, kind: SyntaxKind) -> bool {
705        let kind = kind as u16;
706        let index = kind as usize / Self::SLICE_BITS as usize;
707        let shift = kind % Self::SLICE_BITS;
708        let mask = 1 << shift;
709
710        self.0[index] & mask != 0
711    }
712
713    pub const fn len(&self) -> usize {
714        let mut len: u32 = 0;
715
716        let mut index = 0;
717        while index < self.0.len() {
718            len += self.0[index].count_ones();
719            index += 1;
720        }
721
722        len as usize
723    }
724
725    pub fn iter(&self) -> SyntaxSetIter {
726        SyntaxSetIter {
727            set: self.clone(),
728            index: 0,
729        }
730    }
731}
732
733impl Extend<SyntaxKind> for SyntaxSet {
734    fn extend<T: IntoIterator<Item = SyntaxKind>>(&mut self, iter: T) {
735        let set = std::mem::take(self);
736        *self = set.union(&SyntaxSet::from_iter(iter));
737    }
738}
739
740impl IntoIterator for SyntaxSet {
741    type Item = SyntaxKind;
742    type IntoIter = SyntaxSetIter;
743
744    fn into_iter(self) -> Self::IntoIter {
745        self.iter()
746    }
747}
748
749impl IntoIterator for &SyntaxSet {
750    type Item = SyntaxKind;
751    type IntoIter = SyntaxSetIter;
752
753    fn into_iter(self) -> Self::IntoIter {
754        self.iter()
755    }
756}
757
758impl FromIterator<SyntaxKind> for SyntaxSet {
759    fn from_iter<T: IntoIterator<Item = SyntaxKind>>(iter: T) -> Self {
760        let mut set = SyntaxSet::EMPTY;
761
762        for kind in iter {
763            set.insert(kind);
764        }
765
766        set
767    }
768}
769
770pub struct SyntaxSetIter {
771    set: SyntaxSet,
772    index: u16,
773}
774
775impl Iterator for SyntaxSetIter {
776    type Item = SyntaxKind;
777
778    fn next(&mut self) -> Option<Self::Item> {
779        loop {
780            let slice = self.set.0.get_mut(self.index as usize)?;
781            let bit = slice.trailing_zeros() as u16;
782
783            if bit < SyntaxSet::SLICE_BITS {
784                *slice ^= 1 << bit;
785                let value = self.index * SyntaxSet::SLICE_BITS + bit;
786                return Some(unsafe { std::mem::transmute::<u16, SyntaxKind>(value) });
787            }
788
789            self.index += 1;
790        }
791    }
792
793    fn size_hint(&self) -> (usize, Option<usize>) {
794        let len = self.set.len();
795
796        (len, Some(len))
797    }
798}