@@ -810,10 +810,14 @@ func (p *Parser) parseColumnType(_ Pos) (ColumnType, error) { // nolint:funlen
810810 if p .tryConsumeTokenKind (TokenKindLParen ) != nil {
811811 switch {
812812 case p .matchTokenKind (TokenKindIdent ):
813- if ident .Name == "Nested" {
813+ switch ident .Name {
814+ case "Nested" :
814815 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 ())
815820 }
816- return p .parseComplexType (ident , p .Pos ())
817821 case p .matchTokenKind (TokenKindString ):
818822 if peekToken , err := p .lexer .peekToken (); err == nil && peekToken .Kind == TokenKindSingleEQ {
819823 // enum values
@@ -920,6 +924,81 @@ func (p *Parser) parseColumnTypeWithParams(name *Ident, pos Pos) (*TypeWithParam
920924 }, nil
921925}
922926
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+
9231002func (p * Parser ) parseNestedType (name * Ident , pos Pos ) (* NestedType , error ) {
9241003 columns , err := p .parseTableColumns ()
9251004 if err != nil {
0 commit comments