diff --git a/internal/sql/parser/create.go b/internal/sql/parser/create.go index f946973df..c17da88f0 100644 --- a/internal/sql/parser/create.go +++ b/internal/sql/parser/create.go @@ -184,6 +184,11 @@ func (p *Parser) parseFieldConstraint(fc *database.FieldConstraint) error { return newParseError(scanner.Tokstr(tok, lit), []string{"CONSTRAINT", ")"}, pos) } + withParentheses, err := p.parseOptional(scanner.LPAREN) + if err != nil { + return err + } + // Parse default value expression. // Only a few tokens are allowed. e, err := p.parseExprWithMinPrecedence(scanner.EQ.Precedence(), @@ -217,6 +222,13 @@ func (p *Parser) parseFieldConstraint(fc *database.FieldConstraint) error { } fc.DefaultValue = expr.Constraint(e) + + if withParentheses { + _, err = p.parseOptional(scanner.RPAREN) + if err != nil { + return err + } + } case scanner.UNIQUE: // if it's already unique we return an error if fc.IsUnique { diff --git a/internal/sql/parser/create_test.go b/internal/sql/parser/create_test.go index 49bc4782c..488a41d12 100644 --- a/internal/sql/parser/create_test.go +++ b/internal/sql/parser/create_test.go @@ -61,7 +61,17 @@ func TestParserCreateTable(t *testing.T) { }, }, }, false}, + {"With default", "CREATE TABLE test(foo DEFAULT (\"10\"))", + &statement.CreateTableStmt{ + Info: database.TableInfo{ + TableName: "test", + FieldConstraints: []*database.FieldConstraint{ + {Path: document.Path(testutil.ParsePath(t, "foo")), DefaultValue: expr.Constraint(expr.LiteralValue{Value: types.NewTextValue("10")})}, + }, + }, + }, false}, {"With default twice", "CREATE TABLE test(foo DEFAULT 10 DEFAULT 10)", nil, true}, + {"With default and no parentheses", "CREATE TABLE test(foo DEFAULT (10)", nil, true}, {"With forbidden tokens", "CREATE TABLE test(foo DEFAULT a)", nil, true}, {"With forbidden tokens", "CREATE TABLE test(foo DEFAULT 1 AND 2)", nil, true}, {"With unique", "CREATE TABLE test(foo UNIQUE)",