Skip to content
This repository was archived by the owner on Jan 28, 2021. It is now read-only.

Commit 889bd1e

Browse files
Test parsing utility readQualifiedIdentifierList
Signed-off-by: Alejandro García Montoro <alejandro.garciamontoro@gmail.com>
1 parent f6ff425 commit 889bd1e

File tree

3 files changed

+74
-8
lines changed

3 files changed

+74
-8
lines changed

sql/parse/util.go

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -517,11 +517,17 @@ func maybeList(opening, separator, closing rune, list *[]string) parseFunc {
517517
}
518518
}
519519

520+
// A QualifiedName represents an identifier of type "db_name.table_name"
520521
type QualifiedName struct {
521-
db string
522-
name string
522+
qualifier string
523+
name string
523524
}
524525

526+
// readQualifiedIdentifierList reads a comma-separated list of QualifiedNames.
527+
// Any number of spaces between the qualified names are accepted. The qualifier
528+
// may be empty, in which case the period is optional.
529+
// An example of a correctly formed list is:
530+
// "my_db.myview, db_2.mytable , aTable"
525531
func readQualifiedIdentifierList(list *[]QualifiedName) parseFunc {
526532
return func(rd *bufio.Reader) error {
527533
for {
@@ -537,20 +543,23 @@ func readQualifiedIdentifierList(list *[]QualifiedName) parseFunc {
537543
}
538544

539545
if len(newItem) < 1 || len(newItem) > 2 {
540-
return errUnexpectedSyntax.New("[db_name.]viewName", strings.Join(newItem, "."))
546+
return errUnexpectedSyntax.New(
547+
"[qualifier.]name",
548+
strings.Join(newItem, "."),
549+
)
541550
}
542551

543-
var db, name string
552+
var qualifier, name string
544553

545554
if len(newItem) == 1 {
546-
db = ""
555+
qualifier = ""
547556
name = newItem[0]
548557
} else {
549-
db = newItem[0]
558+
qualifier = newItem[0]
550559
name = newItem[1]
551560
}
552561

553-
*list = append(*list, QualifiedName{db, name})
562+
*list = append(*list, QualifiedName{qualifier, name})
554563

555564
r, _, err := rd.ReadRune()
556565
if err != nil {

sql/parse/util_test.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -465,3 +465,60 @@ func TestReadSpaces(t *testing.T) {
465465
require.Equal(fixture.expectedRemaining, actualRemaining)
466466
}
467467
}
468+
469+
// Tests that readQualifiedIdentifierList correctly parses well-formed lists,
470+
// populating the list of identifiers, and that it errors with partial lists
471+
// and when it does not found any identifiers
472+
func TestReadQualifiedIdentifierList(t *testing.T) {
473+
require := require.New(t)
474+
475+
testFixtures := []struct {
476+
string string
477+
expectedList []QualifiedName
478+
expectedError bool
479+
expectedRemaining string
480+
}{
481+
{
482+
"my_db.myview, db_2.mytable , aTable",
483+
[]QualifiedName{{"my_db", "myview"}, {"db_2", "mytable"}, {"", "aTable"}},
484+
false,
485+
"",
486+
},
487+
{
488+
"single_identifier -remaining",
489+
[]QualifiedName{{"", "single_identifier"}},
490+
false,
491+
"-remaining",
492+
},
493+
{
494+
"",
495+
nil,
496+
true,
497+
"",
498+
},
499+
{
500+
"partial_list,",
501+
[]QualifiedName{{"", "partial_list"}},
502+
true,
503+
"",
504+
},
505+
}
506+
507+
for _, fixture := range testFixtures {
508+
reader := bufio.NewReader(strings.NewReader(fixture.string))
509+
var actualList []QualifiedName
510+
511+
err := readQualifiedIdentifierList(&actualList)(reader)
512+
513+
if fixture.expectedError {
514+
require.Error(err)
515+
} else {
516+
require.NoError(err)
517+
}
518+
519+
require.Equal(fixture.expectedList, actualList)
520+
521+
actualRemaining, _ := reader.ReadString('\n')
522+
require.Equal(fixture.expectedRemaining, actualRemaining)
523+
}
524+
}

sql/parse/views.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ func parseDropView(ctx *sql.Context, s string) (sql.Node, error) {
128128

129129
plans := make([]sql.Node, len(views))
130130
for i, view := range views {
131-
plans[i] = plan.NewSingleDropView(sql.UnresolvedDatabase(view.db), view.name)
131+
plans[i] = plan.NewSingleDropView(sql.UnresolvedDatabase(view.qualifier), view.name)
132132
}
133133

134134
return plan.NewDropView(plans, ifExists), nil

0 commit comments

Comments
 (0)