@@ -2413,7 +2413,9 @@ func (p *Parser) parseDataType() *ast.DataType {
24132413
24142414 // Determine if this type uses named parameters (Nested, Tuple, JSON)
24152415 upperName := strings .ToUpper (dt .Name )
2416- usesNamedParams := upperName == "NESTED" || upperName == "TUPLE" || upperName == "JSON"
2416+ usesNamedParams := upperName == "NESTED" || upperName == "TUPLE" || upperName == "JSON" || upperName == "OBJECT"
2417+ // JSON and OBJECT types wrap their parameters in ObjectTypeArgument
2418+ isObjectType := upperName == "JSON" || upperName == "OBJECT"
24172419
24182420 // Parse type parameters, but stop on keywords that can't be part of type params
24192421 for ! p .currentIs (token .RPAREN ) && ! p .currentIs (token .EOF ) && ! p .currentIs (token .COLLATE ) {
@@ -2422,10 +2424,11 @@ func (p *Parser) parseDataType() *ast.DataType {
24222424 isNamedParam := false
24232425 if usesNamedParams && (p .currentIs (token .IDENT ) || p .current .Token .IsKeyword ()) {
24242426 // Check if current is NOT a type name and peek IS a type name or LPAREN follows for complex types
2425- if ! p .isDataTypeName (p .current .Value ) {
2427+ // But NOT if peek is '=' which indicates an expression like max_dynamic_paths=8
2428+ if ! p .isDataTypeName (p .current .Value ) && ! p .peekIs (token .EQ ) {
24262429 // Current is a name (not a type), next should be a type
24272430 isNamedParam = true
2428- } else if p .peekIs (token .IDENT ) || p .peekIs (token .LPAREN ) {
2431+ } else if ! p .peekIs (token .EQ ) && ( p . peekIs ( token . IDENT ) || p .peekIs (token .LPAREN ) ) {
24292432 // Current looks like a type name but is followed by another identifier
24302433 // This happens with things like "a Tuple(...)" where "a" looks like it could be a type
24312434 // Check if peek is a known type name
@@ -2441,6 +2444,7 @@ func (p *Parser) parseDataType() *ast.DataType {
24412444 }
24422445 }
24432446
2447+ var param ast.Expression
24442448 if isNamedParam {
24452449 // Parse as name + type pair
24462450 pos := p .current .Pos
@@ -2449,19 +2453,29 @@ func (p *Parser) parseDataType() *ast.DataType {
24492453 // Parse the type for this parameter
24502454 paramType := p .parseDataType ()
24512455 if paramType != nil {
2452- ntp : = & ast.NameTypePair {
2456+ param = & ast.NameTypePair {
24532457 Position : pos ,
24542458 Name : paramName ,
24552459 Type : paramType ,
24562460 }
2457- dt .Parameters = append (dt .Parameters , ntp )
24582461 }
24592462 } else if (p .currentIs (token .IDENT ) || p .current .Token .IsKeyword ()) && p .isDataTypeName (p .current .Value ) {
24602463 // It's a type name, parse as data type
2461- dt . Parameters = append ( dt . Parameters , p .parseDataType () )
2464+ param = p .parseDataType ()
24622465 } else {
24632466 // Parse as expression (for things like Decimal(10, 2))
2464- dt .Parameters = append (dt .Parameters , p .parseExpression (LOWEST ))
2467+ param = p .parseExpression (LOWEST )
2468+ }
2469+
2470+ // Wrap in ObjectTypeArgument for JSON/OBJECT types
2471+ if param != nil {
2472+ if isObjectType {
2473+ param = & ast.ObjectTypeArgument {
2474+ Position : param .Pos (),
2475+ Expr : param ,
2476+ }
2477+ }
2478+ dt .Parameters = append (dt .Parameters , param )
24652479 }
24662480
24672481 if p .currentIs (token .COMMA ) {
0 commit comments