good morning!!!!

Skip to content
Snippets Groups Projects
Commit 05f86ea8 authored by José Carlos Nieto's avatar José Carlos Nieto
Browse files

Adding support for implicit table alias.

parent 45b6fedf
No related branches found
No related tags found
No related merge requests found
...@@ -22,6 +22,10 @@ func (self Column) Compile(layout *Template) string { ...@@ -22,6 +22,10 @@ func (self Column) Compile(layout *Template) string {
chunks := reAliasSeparator.Split(input, 2) chunks := reAliasSeparator.Split(input, 2)
if len(chunks) == 1 {
chunks = reSpaceSeparator.Split(input, 2)
}
name := chunks[0] name := chunks[0]
nameChunks := strings.SplitN(name, layout.ColumnSeparator, 2) nameChunks := strings.SplitN(name, layout.ColumnSeparator, 2)
......
...@@ -30,6 +30,19 @@ func TestColumnAs(t *testing.T) { ...@@ -30,6 +30,19 @@ func TestColumnAs(t *testing.T) {
} }
} }
func TestColumnImplicitAs(t *testing.T) {
var s, e string
column := Column{"role.name foo"}
s = column.Compile(defaultTemplate)
e = `"role"."name" AS "foo"`
if s != e {
t.Fatalf("Got: %s, Expecting: %s", s, e)
}
}
func TestColumnRaw(t *testing.T) { func TestColumnRaw(t *testing.T) {
var s, e string var s, e string
......
...@@ -10,11 +10,11 @@ func TestTruncateTable(t *testing.T) { ...@@ -10,11 +10,11 @@ func TestTruncateTable(t *testing.T) {
stmt = Statement{ stmt = Statement{
Type: SqlTruncate, Type: SqlTruncate,
Table: Table{"table name"}, Table: Table{"table_name"},
} }
s = trim(stmt.Compile(defaultTemplate)) s = trim(stmt.Compile(defaultTemplate))
e = `TRUNCATE TABLE "table name"` e = `TRUNCATE TABLE "table_name"`
if s != e { if s != e {
t.Fatalf("Got: %s, Expecting: %s", s, e) t.Fatalf("Got: %s, Expecting: %s", s, e)
...@@ -27,11 +27,11 @@ func TestDropTable(t *testing.T) { ...@@ -27,11 +27,11 @@ func TestDropTable(t *testing.T) {
stmt = Statement{ stmt = Statement{
Type: SqlDropTable, Type: SqlDropTable,
Table: Table{"table name"}, Table: Table{"table_name"},
} }
s = trim(stmt.Compile(defaultTemplate)) s = trim(stmt.Compile(defaultTemplate))
e = `DROP TABLE "table name"` e = `DROP TABLE "table_name"`
if s != e { if s != e {
t.Fatalf("Got: %s, Expecting: %s", s, e) t.Fatalf("Got: %s, Expecting: %s", s, e)
...@@ -44,11 +44,11 @@ func TestDropDatabase(t *testing.T) { ...@@ -44,11 +44,11 @@ func TestDropDatabase(t *testing.T) {
stmt = Statement{ stmt = Statement{
Type: SqlDropDatabase, Type: SqlDropDatabase,
Database: Database{"table name"}, Database: Database{"table_name"},
} }
s = trim(stmt.Compile(defaultTemplate)) s = trim(stmt.Compile(defaultTemplate))
e = `DROP DATABASE "table name"` e = `DROP DATABASE "table_name"`
if s != e { if s != e {
t.Fatalf("Got: %s, Expecting: %s", s, e) t.Fatalf("Got: %s, Expecting: %s", s, e)
...@@ -61,11 +61,11 @@ func TestSelectCount(t *testing.T) { ...@@ -61,11 +61,11 @@ func TestSelectCount(t *testing.T) {
stmt = Statement{ stmt = Statement{
Type: SqlSelectCount, Type: SqlSelectCount,
Table: Table{"table name"}, Table: Table{"table_name"},
} }
s = trim(stmt.Compile(defaultTemplate)) s = trim(stmt.Compile(defaultTemplate))
e = `SELECT COUNT(1) AS _t FROM "table name"` e = `SELECT COUNT(1) AS _t FROM "table_name"`
if s != e { if s != e {
t.Fatalf("Got: %s, Expecting: %s", s, e) t.Fatalf("Got: %s, Expecting: %s", s, e)
...@@ -95,14 +95,14 @@ func TestSelectCountWhere(t *testing.T) { ...@@ -95,14 +95,14 @@ func TestSelectCountWhere(t *testing.T) {
stmt = Statement{ stmt = Statement{
Type: SqlSelectCount, Type: SqlSelectCount,
Table: Table{"table name"}, Table: Table{"table_name"},
Where: Where{ Where: Where{
ColumnValue{Column{"a"}, "=", Value{Raw{"7"}}}, ColumnValue{Column{"a"}, "=", Value{Raw{"7"}}},
}, },
} }
s = trim(stmt.Compile(defaultTemplate)) s = trim(stmt.Compile(defaultTemplate))
e = `SELECT COUNT(1) AS _t FROM "table name" WHERE ("a" = 7)` e = `SELECT COUNT(1) AS _t FROM "table_name" WHERE ("a" = 7)`
if s != e { if s != e {
t.Fatalf("Got: %s, Expecting: %s", s, e) t.Fatalf("Got: %s, Expecting: %s", s, e)
...@@ -115,11 +115,11 @@ func TestSelectStarFrom(t *testing.T) { ...@@ -115,11 +115,11 @@ func TestSelectStarFrom(t *testing.T) {
stmt = Statement{ stmt = Statement{
Type: SqlSelect, Type: SqlSelect,
Table: Table{"table name"}, Table: Table{"table_name"},
} }
s = trim(stmt.Compile(defaultTemplate)) s = trim(stmt.Compile(defaultTemplate))
e = `SELECT * FROM "table name"` e = `SELECT * FROM "table_name"`
if s != e { if s != e {
t.Fatalf("Got: %s, Expecting: %s", s, e) t.Fatalf("Got: %s, Expecting: %s", s, e)
...@@ -248,11 +248,11 @@ func TestSelectFieldsFrom(t *testing.T) { ...@@ -248,11 +248,11 @@ func TestSelectFieldsFrom(t *testing.T) {
{"bar"}, {"bar"},
{"baz"}, {"baz"},
}, },
Table: Table{"table name"}, Table: Table{"table_name"},
} }
s = trim(stmt.Compile(defaultTemplate)) s = trim(stmt.Compile(defaultTemplate))
e = `SELECT "foo", "bar", "baz" FROM "table name"` e = `SELECT "foo", "bar", "baz" FROM "table_name"`
if s != e { if s != e {
t.Fatalf("Got: %s, Expecting: %s", s, e) t.Fatalf("Got: %s, Expecting: %s", s, e)
...@@ -272,11 +272,11 @@ func TestSelectFieldsFromWithLimitOffset(t *testing.T) { ...@@ -272,11 +272,11 @@ func TestSelectFieldsFromWithLimitOffset(t *testing.T) {
{"baz"}, {"baz"},
}, },
Limit: 42, Limit: 42,
Table: Table{"table name"}, Table: Table{"table_name"},
} }
s = trim(stmt.Compile(defaultTemplate)) s = trim(stmt.Compile(defaultTemplate))
e = `SELECT "foo", "bar", "baz" FROM "table name" LIMIT 42` e = `SELECT "foo", "bar", "baz" FROM "table_name" LIMIT 42`
if s != e { if s != e {
t.Fatalf("Got: %s, Expecting: %s", s, e) t.Fatalf("Got: %s, Expecting: %s", s, e)
...@@ -291,11 +291,11 @@ func TestSelectFieldsFromWithLimitOffset(t *testing.T) { ...@@ -291,11 +291,11 @@ func TestSelectFieldsFromWithLimitOffset(t *testing.T) {
{"baz"}, {"baz"},
}, },
Offset: 17, Offset: 17,
Table: Table{"table name"}, Table: Table{"table_name"},
} }
s = trim(stmt.Compile(defaultTemplate)) s = trim(stmt.Compile(defaultTemplate))
e = `SELECT "foo", "bar", "baz" FROM "table name" OFFSET 17` e = `SELECT "foo", "bar", "baz" FROM "table_name" OFFSET 17`
if s != e { if s != e {
t.Fatalf("Got: %s, Expecting: %s", s, e) t.Fatalf("Got: %s, Expecting: %s", s, e)
...@@ -311,11 +311,11 @@ func TestSelectFieldsFromWithLimitOffset(t *testing.T) { ...@@ -311,11 +311,11 @@ func TestSelectFieldsFromWithLimitOffset(t *testing.T) {
}, },
Limit: 42, Limit: 42,
Offset: 17, Offset: 17,
Table: Table{"table name"}, Table: Table{"table_name"},
} }
s = trim(stmt.Compile(defaultTemplate)) s = trim(stmt.Compile(defaultTemplate))
e = `SELECT "foo", "bar", "baz" FROM "table name" LIMIT 42 OFFSET 17` e = `SELECT "foo", "bar", "baz" FROM "table_name" LIMIT 42 OFFSET 17`
if s != e { if s != e {
t.Fatalf("Got: %s, Expecting: %s", s, e) t.Fatalf("Got: %s, Expecting: %s", s, e)
...@@ -339,11 +339,11 @@ func TestSelectFieldsFromWithOrderBy(t *testing.T) { ...@@ -339,11 +339,11 @@ func TestSelectFieldsFromWithOrderBy(t *testing.T) {
SortColumn{Column: Column{"foo"}}, SortColumn{Column: Column{"foo"}},
}, },
}, },
Table: Table{"table name"}, Table: Table{"table_name"},
} }
s = trim(stmt.Compile(defaultTemplate)) s = trim(stmt.Compile(defaultTemplate))
e = `SELECT "foo", "bar", "baz" FROM "table name" ORDER BY "foo"` e = `SELECT "foo", "bar", "baz" FROM "table_name" ORDER BY "foo"`
if s != e { if s != e {
t.Fatalf("Got: %s, Expecting: %s", s, e) t.Fatalf("Got: %s, Expecting: %s", s, e)
...@@ -362,11 +362,11 @@ func TestSelectFieldsFromWithOrderBy(t *testing.T) { ...@@ -362,11 +362,11 @@ func TestSelectFieldsFromWithOrderBy(t *testing.T) {
SortColumn{Column{"foo"}, SqlSortAsc}, SortColumn{Column{"foo"}, SqlSortAsc},
}, },
}, },
Table: Table{"table name"}, Table: Table{"table_name"},
} }
s = trim(stmt.Compile(defaultTemplate)) s = trim(stmt.Compile(defaultTemplate))
e = `SELECT "foo", "bar", "baz" FROM "table name" ORDER BY "foo" ASC` e = `SELECT "foo", "bar", "baz" FROM "table_name" ORDER BY "foo" ASC`
if s != e { if s != e {
t.Fatalf("Got: %s, Expecting: %s", s, e) t.Fatalf("Got: %s, Expecting: %s", s, e)
...@@ -385,11 +385,11 @@ func TestSelectFieldsFromWithOrderBy(t *testing.T) { ...@@ -385,11 +385,11 @@ func TestSelectFieldsFromWithOrderBy(t *testing.T) {
{Column{"foo"}, SqlSortDesc}, {Column{"foo"}, SqlSortDesc},
}, },
}, },
Table: Table{"table name"}, Table: Table{"table_name"},
} }
s = trim(stmt.Compile(defaultTemplate)) s = trim(stmt.Compile(defaultTemplate))
e = `SELECT "foo", "bar", "baz" FROM "table name" ORDER BY "foo" DESC` e = `SELECT "foo", "bar", "baz" FROM "table_name" ORDER BY "foo" DESC`
if s != e { if s != e {
t.Fatalf("Got: %s, Expecting: %s", s, e) t.Fatalf("Got: %s, Expecting: %s", s, e)
...@@ -410,11 +410,11 @@ func TestSelectFieldsFromWithOrderBy(t *testing.T) { ...@@ -410,11 +410,11 @@ func TestSelectFieldsFromWithOrderBy(t *testing.T) {
{Column{"baz"}, SqlSortDesc}, {Column{"baz"}, SqlSortDesc},
}, },
}, },
Table: Table{"table name"}, Table: Table{"table_name"},
} }
s = trim(stmt.Compile(defaultTemplate)) s = trim(stmt.Compile(defaultTemplate))
e = `SELECT "foo", "bar", "baz" FROM "table name" ORDER BY "foo" DESC, "bar" ASC, "baz" DESC` e = `SELECT "foo", "bar", "baz" FROM "table_name" ORDER BY "foo" DESC, "bar" ASC, "baz" DESC`
if s != e { if s != e {
t.Fatalf("Got: %s, Expecting: %s", s, e) t.Fatalf("Got: %s, Expecting: %s", s, e)
...@@ -432,14 +432,14 @@ func TestSelectFieldsFromWhere(t *testing.T) { ...@@ -432,14 +432,14 @@ func TestSelectFieldsFromWhere(t *testing.T) {
{"bar"}, {"bar"},
{"baz"}, {"baz"},
}, },
Table: Table{"table name"}, Table: Table{"table_name"},
Where: Where{ Where: Where{
ColumnValue{Column{"baz"}, "=", Value{99}}, ColumnValue{Column{"baz"}, "=", Value{99}},
}, },
} }
s = trim(stmt.Compile(defaultTemplate)) s = trim(stmt.Compile(defaultTemplate))
e = `SELECT "foo", "bar", "baz" FROM "table name" WHERE ("baz" = '99')` e = `SELECT "foo", "bar", "baz" FROM "table_name" WHERE ("baz" = '99')`
if s != e { if s != e {
t.Fatalf("Got: %s, Expecting: %s", s, e) t.Fatalf("Got: %s, Expecting: %s", s, e)
...@@ -457,7 +457,7 @@ func TestSelectFieldsFromWhereLimitOffset(t *testing.T) { ...@@ -457,7 +457,7 @@ func TestSelectFieldsFromWhereLimitOffset(t *testing.T) {
{"bar"}, {"bar"},
{"baz"}, {"baz"},
}, },
Table: Table{"table name"}, Table: Table{"table_name"},
Where: Where{ Where: Where{
ColumnValue{Column{"baz"}, "=", Value{99}}, ColumnValue{Column{"baz"}, "=", Value{99}},
}, },
...@@ -466,7 +466,7 @@ func TestSelectFieldsFromWhereLimitOffset(t *testing.T) { ...@@ -466,7 +466,7 @@ func TestSelectFieldsFromWhereLimitOffset(t *testing.T) {
} }
s = trim(stmt.Compile(defaultTemplate)) s = trim(stmt.Compile(defaultTemplate))
e = `SELECT "foo", "bar", "baz" FROM "table name" WHERE ("baz" = '99') LIMIT 10 OFFSET 23` e = `SELECT "foo", "bar", "baz" FROM "table_name" WHERE ("baz" = '99') LIMIT 10 OFFSET 23`
if s != e { if s != e {
t.Fatalf("Got: %s, Expecting: %s", s, e) t.Fatalf("Got: %s, Expecting: %s", s, e)
...@@ -479,14 +479,14 @@ func TestDelete(t *testing.T) { ...@@ -479,14 +479,14 @@ func TestDelete(t *testing.T) {
stmt = Statement{ stmt = Statement{
Type: SqlDelete, Type: SqlDelete,
Table: Table{"table name"}, Table: Table{"table_name"},
Where: Where{ Where: Where{
ColumnValue{Column{"baz"}, "=", Value{99}}, ColumnValue{Column{"baz"}, "=", Value{99}},
}, },
} }
s = trim(stmt.Compile(defaultTemplate)) s = trim(stmt.Compile(defaultTemplate))
e = `DELETE FROM "table name" WHERE ("baz" = '99')` e = `DELETE FROM "table_name" WHERE ("baz" = '99')`
if s != e { if s != e {
t.Fatalf("Got: %s, Expecting: %s", s, e) t.Fatalf("Got: %s, Expecting: %s", s, e)
...@@ -499,7 +499,7 @@ func TestUpdate(t *testing.T) { ...@@ -499,7 +499,7 @@ func TestUpdate(t *testing.T) {
stmt = Statement{ stmt = Statement{
Type: SqlUpdate, Type: SqlUpdate,
Table: Table{"table name"}, Table: Table{"table_name"},
ColumnValues: ColumnValues{ ColumnValues: ColumnValues{
{Column{"foo"}, "=", Value{76}}, {Column{"foo"}, "=", Value{76}},
}, },
...@@ -509,7 +509,7 @@ func TestUpdate(t *testing.T) { ...@@ -509,7 +509,7 @@ func TestUpdate(t *testing.T) {
} }
s = trim(stmt.Compile(defaultTemplate)) s = trim(stmt.Compile(defaultTemplate))
e = `UPDATE "table name" SET "foo" = '76' WHERE ("baz" = '99')` e = `UPDATE "table_name" SET "foo" = '76' WHERE ("baz" = '99')`
if s != e { if s != e {
t.Fatalf("Got: %s, Expecting: %s", s, e) t.Fatalf("Got: %s, Expecting: %s", s, e)
...@@ -517,7 +517,7 @@ func TestUpdate(t *testing.T) { ...@@ -517,7 +517,7 @@ func TestUpdate(t *testing.T) {
stmt = Statement{ stmt = Statement{
Type: SqlUpdate, Type: SqlUpdate,
Table: Table{"table name"}, Table: Table{"table_name"},
ColumnValues: ColumnValues{ ColumnValues: ColumnValues{
{Column{"foo"}, "=", Value{76}}, {Column{"foo"}, "=", Value{76}},
{Column{"bar"}, "=", Value{Raw{"88"}}}, {Column{"bar"}, "=", Value{Raw{"88"}}},
...@@ -528,7 +528,7 @@ func TestUpdate(t *testing.T) { ...@@ -528,7 +528,7 @@ func TestUpdate(t *testing.T) {
} }
s = trim(stmt.Compile(defaultTemplate)) s = trim(stmt.Compile(defaultTemplate))
e = `UPDATE "table name" SET "foo" = '76', "bar" = 88 WHERE ("baz" = '99')` e = `UPDATE "table_name" SET "foo" = '76', "bar" = 88 WHERE ("baz" = '99')`
if s != e { if s != e {
t.Fatalf("Got: %s, Expecting: %s", s, e) t.Fatalf("Got: %s, Expecting: %s", s, e)
...@@ -541,7 +541,7 @@ func TestInsert(t *testing.T) { ...@@ -541,7 +541,7 @@ func TestInsert(t *testing.T) {
stmt = Statement{ stmt = Statement{
Type: SqlInsert, Type: SqlInsert,
Table: Table{"table name"}, Table: Table{"table_name"},
Columns: Columns{ Columns: Columns{
Column{"foo"}, Column{"foo"},
Column{"bar"}, Column{"bar"},
...@@ -555,7 +555,7 @@ func TestInsert(t *testing.T) { ...@@ -555,7 +555,7 @@ func TestInsert(t *testing.T) {
} }
s = trim(stmt.Compile(defaultTemplate)) s = trim(stmt.Compile(defaultTemplate))
e = `INSERT INTO "table name" ("foo", "bar", "baz") VALUES ('1', '2', 3)` e = `INSERT INTO "table_name" ("foo", "bar", "baz") VALUES ('1', '2', 3)`
if s != e { if s != e {
t.Fatalf("Got: %s, Expecting: %s", s, e) t.Fatalf("Got: %s, Expecting: %s", s, e)
...@@ -568,7 +568,7 @@ func TestInsertExtra(t *testing.T) { ...@@ -568,7 +568,7 @@ func TestInsertExtra(t *testing.T) {
stmt = Statement{ stmt = Statement{
Type: SqlInsert, Type: SqlInsert,
Table: Table{"table name"}, Table: Table{"table_name"},
Extra: "RETURNING id", Extra: "RETURNING id",
Columns: Columns{ Columns: Columns{
Column{"foo"}, Column{"foo"},
...@@ -583,7 +583,7 @@ func TestInsertExtra(t *testing.T) { ...@@ -583,7 +583,7 @@ func TestInsertExtra(t *testing.T) {
} }
s = trim(stmt.Compile(defaultTemplate)) s = trim(stmt.Compile(defaultTemplate))
e = `INSERT INTO "table name" ("foo", "bar", "baz") VALUES ('1', '2', 3) RETURNING id` e = `INSERT INTO "table_name" ("foo", "bar", "baz") VALUES ('1', '2', 3) RETURNING id`
if s != e { if s != e {
t.Fatalf("Got: %s, Expecting: %s", s, e) t.Fatalf("Got: %s, Expecting: %s", s, e)
......
...@@ -8,6 +8,7 @@ import ( ...@@ -8,6 +8,7 @@ import (
var ( var (
reTableSeparator = regexp.MustCompile(`\s*?,\s*?`) reTableSeparator = regexp.MustCompile(`\s*?,\s*?`)
reAliasSeparator = regexp.MustCompile(`(?i:\s+AS\s+)`) reAliasSeparator = regexp.MustCompile(`(?i:\s+AS\s+)`)
reSpaceSeparator = regexp.MustCompile(`\s+`)
) )
type table_t struct { type table_t struct {
...@@ -24,6 +25,10 @@ func quotedTableName(layout *Template, input string) string { ...@@ -24,6 +25,10 @@ func quotedTableName(layout *Template, input string) string {
chunks := reAliasSeparator.Split(input, 2) chunks := reAliasSeparator.Split(input, 2)
if len(chunks) == 1 {
chunks = reSpaceSeparator.Split(input, 2)
}
name := chunks[0] name := chunks[0]
nameChunks := strings.SplitN(name, layout.ColumnSeparator, 2) nameChunks := strings.SplitN(name, layout.ColumnSeparator, 2)
......
...@@ -46,6 +46,20 @@ func TestTableCompoundAlias(t *testing.T) { ...@@ -46,6 +46,20 @@ func TestTableCompoundAlias(t *testing.T) {
} }
} }
func TestTableImplicitAlias(t *testing.T) {
var s, e string
var table Table
table = Table{"artist.foo baz"}
s = trim(table.Compile(defaultTemplate))
e = `"artist"."foo" AS "baz"`
if s != e {
t.Fatalf("Got: %s, Expecting: %s", s, e)
}
}
func TestTableMultiple(t *testing.T) { func TestTableMultiple(t *testing.T) {
var s, e string var s, e string
var table Table var table Table
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment