Skip to content

Commit a80699f

Browse files
authored
Permit a comment after the last semicolon (#154)
1 parent a45da2a commit a80699f

2 files changed

Lines changed: 35 additions & 11 deletions

File tree

cli.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -467,6 +467,11 @@ func buildCommands(input string) ([]*command, error) {
467467
var cmds []*command
468468
var pendingDdls []string
469469
for _, separated := range separateInput(input) {
470+
// Ignore the last empty statement
471+
if separated.delim == delimiterUndefined && separated.statementWithoutComments == "" {
472+
continue
473+
}
474+
470475
stmt, err := BuildStatementWithComments(separated.statementWithoutComments, separated.statement)
471476
if err != nil {
472477
return nil, err

cli_test.go

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -40,50 +40,69 @@ func (n *nopCloser) Close() error {
4040

4141
func TestBuildCommands(t *testing.T) {
4242
tests := []struct {
43-
Input string
44-
Expected []*command
43+
Input string
44+
Expected []*command
45+
ExpectError bool
4546
}{
46-
{`SELECT * FROM t1;`, []*command{{&SelectStatement{"SELECT * FROM t1"}, false}}},
47-
{`CREATE TABLE t1;`, []*command{{&BulkDdlStatement{[]string{"CREATE TABLE t1"}}, false}}},
48-
{`CREATE TABLE t1(pk INT64) PRIMARY KEY(pk); ALTER TABLE t1 ADD COLUMN col INT64; CREATE INDEX i1 ON t1(col); DROP INDEX i1; DROP TABLE t1;`,
49-
[]*command{{&BulkDdlStatement{[]string{
47+
{Input: `SELECT * FROM t1;`, Expected: []*command{{&SelectStatement{"SELECT * FROM t1"}, false}}},
48+
{Input: `CREATE TABLE t1;`, Expected: []*command{{&BulkDdlStatement{[]string{"CREATE TABLE t1"}}, false}}},
49+
{Input: `CREATE TABLE t1(pk INT64) PRIMARY KEY(pk); ALTER TABLE t1 ADD COLUMN col INT64; CREATE INDEX i1 ON t1(col); DROP INDEX i1; DROP TABLE t1;`,
50+
Expected: []*command{{&BulkDdlStatement{[]string{
5051
"CREATE TABLE t1(pk INT64) PRIMARY KEY(pk)",
5152
"ALTER TABLE t1 ADD COLUMN col INT64",
5253
"CREATE INDEX i1 ON t1(col)",
5354
"DROP INDEX i1",
5455
"DROP TABLE t1",
5556
}}, false}}},
56-
{`CREATE TABLE t1(pk INT64) PRIMARY KEY(pk);
57+
{Input: `CREATE TABLE t1(pk INT64) PRIMARY KEY(pk);
5758
CREATE TABLE t2(pk INT64) PRIMARY KEY(pk);
5859
SELECT * FROM t1\G
5960
DROP TABLE t1;
6061
DROP TABLE t2;
6162
SELECT 1;`,
62-
[]*command{
63+
Expected: []*command{
6364
{&BulkDdlStatement{[]string{"CREATE TABLE t1(pk INT64) PRIMARY KEY(pk)", "CREATE TABLE t2(pk INT64) PRIMARY KEY(pk)"}}, false},
6465
{&SelectStatement{"SELECT * FROM t1"}, true},
6566
{&BulkDdlStatement{[]string{"DROP TABLE t1", "DROP TABLE t2"}}, false},
6667
{&SelectStatement{"SELECT 1"}, false},
6768
}},
6869
{
69-
`
70+
Input: `
7071
CREATE TABLE t1(pk INT64 /* NOT NULL*/, col INT64) PRIMARY KEY(pk);
7172
INSERT t1(pk/*, col*/) VALUES(1/*, 2*/);
7273
UPDATE t1 SET col = /* pk + */ col + 1 WHERE TRUE;
7374
DELETE t1 WHERE TRUE /* AND pk = 1 */;
7475
SELECT 0x1/**/A`,
75-
[]*command{
76+
Expected: []*command{
7677
{&BulkDdlStatement{[]string{"CREATE TABLE t1(pk INT64 , col INT64) PRIMARY KEY(pk)"}}, false},
7778
{&DmlStatement{"INSERT t1(pk/*, col*/) VALUES(1/*, 2*/)"}, false},
7879
{&DmlStatement{"UPDATE t1 SET col = /* pk + */ col + 1 WHERE TRUE"}, false},
7980
{&DmlStatement{"DELETE t1 WHERE TRUE /* AND pk = 1 */"}, false},
8081
{&SelectStatement{"SELECT 0x1/**/A"}, false},
8182
}},
83+
{
84+
// spanner-cli don't permit empty statements.
85+
Input: `SELECT 1; /* comment */; SELECT 2`,
86+
ExpectError: true,
87+
},
88+
{
89+
Input: `SELECT 1; /* comment 1 */; /* comment 2 */`,
90+
ExpectError: true,
91+
},
92+
{
93+
// A comment after the last semicolon is permitted.
94+
Input: `SELECT 1; /* comment */`,
95+
Expected: []*command{
96+
{&SelectStatement{"SELECT 1"}, false},
97+
}},
8298
}
8399

84100
for _, test := range tests {
85101
got, err := buildCommands(test.Input)
86-
if err != nil {
102+
if test.ExpectError && err == nil {
103+
t.Errorf("expect error but not error, input: %v", test.Input)
104+
}
105+
if !test.ExpectError && err != nil {
87106
t.Errorf("err: %v, input: %v", err, test.Input)
88107
}
89108

0 commit comments

Comments
 (0)