Skip to content

Commit

Permalink
insert spaces between binary operators as well
Browse files Browse the repository at this point in the history
fixes, e.g., parsing of 1e-/*test*/-5.

very much related to cockroachdb#1810.
  • Loading branch information
tbg committed Jul 25, 2015
1 parent 0b4ea4d commit 9e41725
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 45 deletions.
12 changes: 2 additions & 10 deletions sql/parser/expr.go
Original file line number Diff line number Diff line change
Expand Up @@ -375,7 +375,7 @@ type BinaryExpr struct {
}

func (node *BinaryExpr) String() string {
return fmt.Sprintf("%s%s%s", node.Left, node.Operator, node.Right)
return fmt.Sprintf("%s %s %s", node.Left, node.Operator, node.Right)
}

// UnaryOp represents a unary operator.
Expand Down Expand Up @@ -408,15 +408,7 @@ type UnaryExpr struct {
}

func (node *UnaryExpr) String() string {
extra := ""
if node.Operator == UnaryMinus {
// We don't want to end up printing --5 since `--` indicates a comment.
// Instead, space them out to "- -".
if nNode, ok := node.Expr.(*UnaryExpr); ok && nNode.Operator == UnaryMinus {
extra = " "
}
}
return fmt.Sprintf("%s%s%s", node.Operator, extra, node.Expr)
return fmt.Sprintf("%s %s", node.Operator, node.Expr)
}

// FuncExpr represents a function call.
Expand Down
53 changes: 29 additions & 24 deletions sql/parser/parse_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -75,16 +75,16 @@ func TestParse(t *testing.T) {
{`INSERT INTO a.b VALUES (1)`},
{`INSERT INTO a VALUES (1, 2)`},
{`INSERT INTO a VALUES (1, 2), (3, 4)`},
{`INSERT INTO a VALUES (a+1, 2*3)`},
{`INSERT INTO a VALUES (a + 1, 2 * 3)`},
{`INSERT INTO a(a, b) VALUES (1, 2)`},
{`INSERT INTO a(a, a.b) VALUES (1, 2)`},
{`INSERT INTO a SELECT b, c FROM d`},
{`INSERT INTO a DEFAULT VALUES`},

{`SELECT 1+1`},
{`SELECT - -5`},
{`SELECT -1`},
{`SELECT +1`},
{`SELECT 1 + 1`},
{`SELECT - - 5`},
{`SELECT - 1`},
{`SELECT + 1`},
{`SELECT .1`},
{`SELECT 1.2e1`},
{`SELECT 1.2e+1`},
Expand Down Expand Up @@ -127,7 +127,7 @@ func TestParse(t *testing.T) {
{`SELECT DISTINCT 1 FROM t`},
{`SELECT COUNT(DISTINCT a) FROM t`},

{`SELECT FROM t WHERE b = -2`},
{`SELECT FROM t WHERE b = - 2`},
{`SELECT FROM t WHERE a = b`},
{`SELECT FROM t WHERE a = b AND a = c`},
{`SELECT FROM t WHERE a = b OR a = c`},
Expand All @@ -152,19 +152,19 @@ func TestParse(t *testing.T) {
{`SELECT FROM t WHERE a != b`},
{`SELECT FROM t WHERE a = (SELECT a FROM t)`},
{`SELECT FROM t WHERE a = (b)`},
{`SELECT FROM t WHERE a = b&c`},
{`SELECT FROM t WHERE a = b|c`},
{`SELECT FROM t WHERE a = b^c`},
{`SELECT FROM t WHERE a = b+c`},
{`SELECT FROM t WHERE a = b-c`},
{`SELECT FROM t WHERE a = b*c`},
{`SELECT FROM t WHERE a = b/c`},
{`SELECT FROM t WHERE a = b%c`},
{`SELECT FROM t WHERE a = b#c`},
{`SELECT FROM t WHERE a = b||c`},
{`SELECT FROM t WHERE a = +b`},
{`SELECT FROM t WHERE a = -b`},
{`SELECT FROM t WHERE a = ~b`},
{`SELECT FROM t WHERE a = b & c`},
{`SELECT FROM t WHERE a = b | c`},
{`SELECT FROM t WHERE a = b ^ c`},
{`SELECT FROM t WHERE a = b + c`},
{`SELECT FROM t WHERE a = b - c`},
{`SELECT FROM t WHERE a = b * c`},
{`SELECT FROM t WHERE a = b / c`},
{`SELECT FROM t WHERE a = b % c`},
{`SELECT FROM t WHERE a = b # c`},
{`SELECT FROM t WHERE a = b || c`},
{`SELECT FROM t WHERE a = + b`},
{`SELECT FROM t WHERE a = - b`},
{`SELECT FROM t WHERE a = ~ b`},
{`SELECT FROM t WHERE CASE WHEN a = b THEN c END`},
{`SELECT FROM t WHERE CASE WHEN a = b THEN c ELSE d END`},
{`SELECT FROM t WHERE CASE WHEN a = b THEN c WHEN b = d THEN d ELSE d END`},
Expand Down Expand Up @@ -208,7 +208,7 @@ func TestParse(t *testing.T) {
{`UPDATE a.b SET b = 3`},
{`UPDATE a SET b.c = 3`},
{`UPDATE a SET b = 3, c = 4`},
{`UPDATE a SET b = 3+4`},
{`UPDATE a SET b = 3 + 4`},
{`UPDATE a SET b = 3 WHERE a = b`},
}
for _, d := range testData {
Expand All @@ -218,7 +218,7 @@ func TestParse(t *testing.T) {
}
s := stmts.String()
if d.sql != s {
t.Fatalf("expected %s, but found %s", d.sql, s)
t.Errorf("expected %s, but found %s", d.sql, s)
}
}
}
Expand Down Expand Up @@ -271,9 +271,14 @@ func TestParse2(t *testing.T) {
`SELECT CAST('1' AS INT)`},
// Double negation. See #1800.
{`SELECT *,-/* comment */-5`,
`SELECT *, - -5`},
`SELECT *, - - 5`},
{"SELECT -\n-5",
`SELECT - -5`},
`SELECT - - 5`},
{"SELECT 1e-\n-1",
`SELECT 1e- - 1`},
{`SELECT -0.-/*test*/-1`,
`SELECT - 0. - - 1`,
},
}
for _, d := range testData {
stmts, err := Parse(d.sql)
Expand All @@ -282,7 +287,7 @@ func TestParse2(t *testing.T) {
}
s := stmts.String()
if d.expected != s {
t.Fatalf("expected %s, but found %s", d.expected, s)
t.Errorf("expected %s, but found %s", d.expected, s)
}
}
}
Expand Down
22 changes: 11 additions & 11 deletions sql/parser/walk_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,18 +35,18 @@ func TestFillArgs(t *testing.T) {
}{
{`$1`, `'a'`, mapArgs{1: DString(`a`)}},
{`($1, $1, $1)`, `('a', 'a', 'a')`, mapArgs{1: DString(`a`)}},
{`$1 & $2`, `1&2`, mapArgs{1: DInt(1), 2: DInt(2)}},
{`$1 | $2`, `1|2`, mapArgs{1: DInt(1), 2: DInt(2)}},
{`$1 # $2`, `1#2`, mapArgs{1: DInt(1), 2: DInt(2)}},
{`$1 + $2`, `1+2`, mapArgs{1: DInt(1), 2: DInt(2)}},
{`$1 - $2`, `1-2`, mapArgs{1: DInt(1), 2: DInt(2)}},
{`$1 * $2`, `1*2`, mapArgs{1: DInt(1), 2: DInt(2)}},
{`$1 % $2`, `1%2`, mapArgs{1: DInt(1), 2: DInt(2)}},
{`$1 / $2`, `1/2`, mapArgs{1: DInt(1), 2: DInt(2)}},
{`$1 / $2`, `1/2`, mapArgs{1: DInt(1), 2: DInt(2)}},
{`$1 + $2 + ($3 * $4)`, `1+2+(3*4)`,
{`$1 & $2`, `1 & 2`, mapArgs{1: DInt(1), 2: DInt(2)}},
{`$1 | $2`, `1 | 2`, mapArgs{1: DInt(1), 2: DInt(2)}},
{`$1 # $2`, `1 # 2`, mapArgs{1: DInt(1), 2: DInt(2)}},
{`$1 + $2`, `1 + 2`, mapArgs{1: DInt(1), 2: DInt(2)}},
{`$1 - $2`, `1 - 2`, mapArgs{1: DInt(1), 2: DInt(2)}},
{`$1 * $2`, `1 * 2`, mapArgs{1: DInt(1), 2: DInt(2)}},
{`$1 % $2`, `1 % 2`, mapArgs{1: DInt(1), 2: DInt(2)}},
{`$1 / $2`, `1 / 2`, mapArgs{1: DInt(1), 2: DInt(2)}},
{`$1 / $2`, `1 / 2`, mapArgs{1: DInt(1), 2: DInt(2)}},
{`$1 + $2 + ($3 * $4)`, `1 + 2 + (3 * 4)`,
mapArgs{1: DInt(1), 2: DInt(2), 3: DInt(3), 4: DInt(4)}},
{`$1 || $2`, `'a'||'b'`, mapArgs{1: DString("a"), 2: DString("b")}},
{`$1 || $2`, `'a' || 'b'`, mapArgs{1: DString("a"), 2: DString("b")}},
{`$1 OR $2`, `true OR false`, mapArgs{1: DBool(true), 2: DBool(false)}},
{`$1 AND $2`, `true AND false`, mapArgs{1: DBool(true), 2: DBool(false)}},
{`$1 = $2`, `1 = 2`, mapArgs{1: DInt(1), 2: DInt(2)}},
Expand Down

0 comments on commit 9e41725

Please sign in to comment.