@@ -810,10 +810,14 @@ func (p *Parser) parseColumnType(_ Pos) (ColumnType, error) { // nolint:funlen
810
810
if p .tryConsumeTokenKind (TokenKindLParen ) != nil {
811
811
switch {
812
812
case p .matchTokenKind (TokenKindIdent ):
813
- if ident .Name == "Nested" {
813
+ switch ident .Name {
814
+ case "Nested" :
814
815
return p .parseNestedType (ident , p .Pos ())
816
+ case "JSON" :
817
+ return p .parseJSONType (ident , p .Pos ())
818
+ default :
819
+ return p .parseComplexType (ident , p .Pos ())
815
820
}
816
- return p .parseComplexType (ident , p .Pos ())
817
821
case p .matchTokenKind (TokenKindString ):
818
822
if peekToken , err := p .lexer .peekToken (); err == nil && peekToken .Kind == TokenKindSingleEQ {
819
823
// enum values
@@ -920,6 +924,81 @@ func (p *Parser) parseColumnTypeWithParams(name *Ident, pos Pos) (*TypeWithParam
920
924
}, nil
921
925
}
922
926
927
+ func (p * Parser ) parseJSONPath () (* JSONPath , error ) {
928
+ idents := make ([]* Ident , 0 )
929
+ ident , err := p .parseIdent ()
930
+ if err != nil {
931
+ return nil , err
932
+ }
933
+ idents = append (idents , ident )
934
+
935
+ for ! p .lexer .isEOF () && p .tryConsumeTokenKind (TokenKindDot ) != nil {
936
+ ident , err := p .parseIdent ()
937
+ if err != nil {
938
+ return nil , err
939
+ }
940
+ idents = append (idents , ident )
941
+ }
942
+ return & JSONPath {
943
+ Idents : idents ,
944
+ }, nil
945
+ }
946
+
947
+ func (p * Parser ) parseJSONOption () (* JSONOption , error ) {
948
+ switch {
949
+ case p .tryConsumeKeyword (KeywordSkip ) != nil :
950
+ if p .tryConsumeKeyword (KeywordRegexp ) != nil {
951
+ regex , err := p .parseString (p .Pos ())
952
+ if err != nil {
953
+ return nil , err
954
+ }
955
+ return & JSONOption {
956
+ SkipRegex : regex ,
957
+ }, nil
958
+ }
959
+ jsonPath , err := p .parseJSONPath ()
960
+ if err != nil {
961
+ return nil , err
962
+ }
963
+ return & JSONOption {
964
+ SkipPath : jsonPath ,
965
+ }, nil
966
+ default :
967
+ return nil , fmt .Errorf ("unexpected token kind: %s" , p .lastTokenKind ())
968
+ }
969
+ }
970
+
971
+ func (p * Parser ) parseJSONType (name * Ident , pos Pos ) (* JSONType , error ) {
972
+ if p .matchTokenKind (TokenKindLParen ) {
973
+ return & JSONType {Name : name }, nil
974
+ }
975
+
976
+ options := make ([]* JSONOption , 0 )
977
+ for ! p .lexer .isEOF () && ! p .matchTokenKind (TokenKindRParen ) {
978
+ option , err := p .parseJSONOption ()
979
+ if err != nil {
980
+ return nil , err
981
+ }
982
+ options = append (options , option )
983
+ if p .tryConsumeTokenKind ("," ) == nil {
984
+ break
985
+ }
986
+ }
987
+
988
+ rparenPos := p .Pos ()
989
+ if _ , err := p .consumeTokenKind (TokenKindRParen ); err != nil {
990
+ return nil , err
991
+ }
992
+ return & JSONType {
993
+ Name : name ,
994
+ Options : & JSONOptions {
995
+ LParen : pos ,
996
+ RParen : rparenPos ,
997
+ Items : options ,
998
+ },
999
+ }, nil
1000
+ }
1001
+
923
1002
func (p * Parser ) parseNestedType (name * Ident , pos Pos ) (* NestedType , error ) {
924
1003
columns , err := p .parseTableColumns ()
925
1004
if err != nil {
0 commit comments