From 05f86ea8341127d19b1669424170cd6f795e36af Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jos=C3=A9=20Carlos=20Nieto?= <jose.carlos@menteslibres.net>
Date: Tue, 17 Jun 2014 15:06:31 -0500
Subject: [PATCH] Adding support for implicit table alias.

---
 util/sqlgen/column.go      |  4 ++
 util/sqlgen/column_test.go | 13 ++++++
 util/sqlgen/main_test.go   | 84 +++++++++++++++++++-------------------
 util/sqlgen/table.go       |  5 +++
 util/sqlgen/table_test.go  | 14 +++++++
 5 files changed, 78 insertions(+), 42 deletions(-)

diff --git a/util/sqlgen/column.go b/util/sqlgen/column.go
index af8139f3..4b3f972c 100644
--- a/util/sqlgen/column.go
+++ b/util/sqlgen/column.go
@@ -22,6 +22,10 @@ func (self Column) Compile(layout *Template) string {
 
 		chunks := reAliasSeparator.Split(input, 2)
 
+		if len(chunks) == 1 {
+			chunks = reSpaceSeparator.Split(input, 2)
+		}
+
 		name := chunks[0]
 
 		nameChunks := strings.SplitN(name, layout.ColumnSeparator, 2)
diff --git a/util/sqlgen/column_test.go b/util/sqlgen/column_test.go
index 8420dc88..62f3929d 100644
--- a/util/sqlgen/column_test.go
+++ b/util/sqlgen/column_test.go
@@ -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) {
 	var s, e string
 
diff --git a/util/sqlgen/main_test.go b/util/sqlgen/main_test.go
index 7ebfb8fb..0cfe5c80 100644
--- a/util/sqlgen/main_test.go
+++ b/util/sqlgen/main_test.go
@@ -10,11 +10,11 @@ func TestTruncateTable(t *testing.T) {
 
 	stmt = Statement{
 		Type:  SqlTruncate,
-		Table: Table{"table name"},
+		Table: Table{"table_name"},
 	}
 
 	s = trim(stmt.Compile(defaultTemplate))
-	e = `TRUNCATE TABLE "table name"`
+	e = `TRUNCATE TABLE "table_name"`
 
 	if s != e {
 		t.Fatalf("Got: %s, Expecting: %s", s, e)
@@ -27,11 +27,11 @@ func TestDropTable(t *testing.T) {
 
 	stmt = Statement{
 		Type:  SqlDropTable,
-		Table: Table{"table name"},
+		Table: Table{"table_name"},
 	}
 
 	s = trim(stmt.Compile(defaultTemplate))
-	e = `DROP TABLE "table name"`
+	e = `DROP TABLE "table_name"`
 
 	if s != e {
 		t.Fatalf("Got: %s, Expecting: %s", s, e)
@@ -44,11 +44,11 @@ func TestDropDatabase(t *testing.T) {
 
 	stmt = Statement{
 		Type:     SqlDropDatabase,
-		Database: Database{"table name"},
+		Database: Database{"table_name"},
 	}
 
 	s = trim(stmt.Compile(defaultTemplate))
-	e = `DROP DATABASE "table name"`
+	e = `DROP DATABASE "table_name"`
 
 	if s != e {
 		t.Fatalf("Got: %s, Expecting: %s", s, e)
@@ -61,11 +61,11 @@ func TestSelectCount(t *testing.T) {
 
 	stmt = Statement{
 		Type:  SqlSelectCount,
-		Table: Table{"table name"},
+		Table: Table{"table_name"},
 	}
 
 	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 {
 		t.Fatalf("Got: %s, Expecting: %s", s, e)
@@ -95,14 +95,14 @@ func TestSelectCountWhere(t *testing.T) {
 
 	stmt = Statement{
 		Type:  SqlSelectCount,
-		Table: Table{"table name"},
+		Table: Table{"table_name"},
 		Where: Where{
 			ColumnValue{Column{"a"}, "=", Value{Raw{"7"}}},
 		},
 	}
 
 	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 {
 		t.Fatalf("Got: %s, Expecting: %s", s, e)
@@ -115,11 +115,11 @@ func TestSelectStarFrom(t *testing.T) {
 
 	stmt = Statement{
 		Type:  SqlSelect,
-		Table: Table{"table name"},
+		Table: Table{"table_name"},
 	}
 
 	s = trim(stmt.Compile(defaultTemplate))
-	e = `SELECT * FROM "table name"`
+	e = `SELECT * FROM "table_name"`
 
 	if s != e {
 		t.Fatalf("Got: %s, Expecting: %s", s, e)
@@ -248,11 +248,11 @@ func TestSelectFieldsFrom(t *testing.T) {
 			{"bar"},
 			{"baz"},
 		},
-		Table: Table{"table name"},
+		Table: Table{"table_name"},
 	}
 
 	s = trim(stmt.Compile(defaultTemplate))
-	e = `SELECT "foo", "bar", "baz" FROM "table name"`
+	e = `SELECT "foo", "bar", "baz" FROM "table_name"`
 
 	if s != e {
 		t.Fatalf("Got: %s, Expecting: %s", s, e)
@@ -272,11 +272,11 @@ func TestSelectFieldsFromWithLimitOffset(t *testing.T) {
 			{"baz"},
 		},
 		Limit: 42,
-		Table: Table{"table name"},
+		Table: Table{"table_name"},
 	}
 
 	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 {
 		t.Fatalf("Got: %s, Expecting: %s", s, e)
@@ -291,11 +291,11 @@ func TestSelectFieldsFromWithLimitOffset(t *testing.T) {
 			{"baz"},
 		},
 		Offset: 17,
-		Table:  Table{"table name"},
+		Table:  Table{"table_name"},
 	}
 
 	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 {
 		t.Fatalf("Got: %s, Expecting: %s", s, e)
@@ -311,11 +311,11 @@ func TestSelectFieldsFromWithLimitOffset(t *testing.T) {
 		},
 		Limit:  42,
 		Offset: 17,
-		Table:  Table{"table name"},
+		Table:  Table{"table_name"},
 	}
 
 	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 {
 		t.Fatalf("Got: %s, Expecting: %s", s, e)
@@ -339,11 +339,11 @@ func TestSelectFieldsFromWithOrderBy(t *testing.T) {
 				SortColumn{Column: Column{"foo"}},
 			},
 		},
-		Table: Table{"table name"},
+		Table: Table{"table_name"},
 	}
 
 	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 {
 		t.Fatalf("Got: %s, Expecting: %s", s, e)
@@ -362,11 +362,11 @@ func TestSelectFieldsFromWithOrderBy(t *testing.T) {
 				SortColumn{Column{"foo"}, SqlSortAsc},
 			},
 		},
-		Table: Table{"table name"},
+		Table: Table{"table_name"},
 	}
 
 	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 {
 		t.Fatalf("Got: %s, Expecting: %s", s, e)
@@ -385,11 +385,11 @@ func TestSelectFieldsFromWithOrderBy(t *testing.T) {
 				{Column{"foo"}, SqlSortDesc},
 			},
 		},
-		Table: Table{"table name"},
+		Table: Table{"table_name"},
 	}
 
 	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 {
 		t.Fatalf("Got: %s, Expecting: %s", s, e)
@@ -410,11 +410,11 @@ func TestSelectFieldsFromWithOrderBy(t *testing.T) {
 				{Column{"baz"}, SqlSortDesc},
 			},
 		},
-		Table: Table{"table name"},
+		Table: Table{"table_name"},
 	}
 
 	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 {
 		t.Fatalf("Got: %s, Expecting: %s", s, e)
@@ -432,14 +432,14 @@ func TestSelectFieldsFromWhere(t *testing.T) {
 			{"bar"},
 			{"baz"},
 		},
-		Table: Table{"table name"},
+		Table: Table{"table_name"},
 		Where: Where{
 			ColumnValue{Column{"baz"}, "=", Value{99}},
 		},
 	}
 
 	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 {
 		t.Fatalf("Got: %s, Expecting: %s", s, e)
@@ -457,7 +457,7 @@ func TestSelectFieldsFromWhereLimitOffset(t *testing.T) {
 			{"bar"},
 			{"baz"},
 		},
-		Table: Table{"table name"},
+		Table: Table{"table_name"},
 		Where: Where{
 			ColumnValue{Column{"baz"}, "=", Value{99}},
 		},
@@ -466,7 +466,7 @@ func TestSelectFieldsFromWhereLimitOffset(t *testing.T) {
 	}
 
 	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 {
 		t.Fatalf("Got: %s, Expecting: %s", s, e)
@@ -479,14 +479,14 @@ func TestDelete(t *testing.T) {
 
 	stmt = Statement{
 		Type:  SqlDelete,
-		Table: Table{"table name"},
+		Table: Table{"table_name"},
 		Where: Where{
 			ColumnValue{Column{"baz"}, "=", Value{99}},
 		},
 	}
 
 	s = trim(stmt.Compile(defaultTemplate))
-	e = `DELETE FROM "table name" WHERE ("baz" = '99')`
+	e = `DELETE FROM "table_name" WHERE ("baz" = '99')`
 
 	if s != e {
 		t.Fatalf("Got: %s, Expecting: %s", s, e)
@@ -499,7 +499,7 @@ func TestUpdate(t *testing.T) {
 
 	stmt = Statement{
 		Type:  SqlUpdate,
-		Table: Table{"table name"},
+		Table: Table{"table_name"},
 		ColumnValues: ColumnValues{
 			{Column{"foo"}, "=", Value{76}},
 		},
@@ -509,7 +509,7 @@ func TestUpdate(t *testing.T) {
 	}
 
 	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 {
 		t.Fatalf("Got: %s, Expecting: %s", s, e)
@@ -517,7 +517,7 @@ func TestUpdate(t *testing.T) {
 
 	stmt = Statement{
 		Type:  SqlUpdate,
-		Table: Table{"table name"},
+		Table: Table{"table_name"},
 		ColumnValues: ColumnValues{
 			{Column{"foo"}, "=", Value{76}},
 			{Column{"bar"}, "=", Value{Raw{"88"}}},
@@ -528,7 +528,7 @@ func TestUpdate(t *testing.T) {
 	}
 
 	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 {
 		t.Fatalf("Got: %s, Expecting: %s", s, e)
@@ -541,7 +541,7 @@ func TestInsert(t *testing.T) {
 
 	stmt = Statement{
 		Type:  SqlInsert,
-		Table: Table{"table name"},
+		Table: Table{"table_name"},
 		Columns: Columns{
 			Column{"foo"},
 			Column{"bar"},
@@ -555,7 +555,7 @@ func TestInsert(t *testing.T) {
 	}
 
 	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 {
 		t.Fatalf("Got: %s, Expecting: %s", s, e)
@@ -568,7 +568,7 @@ func TestInsertExtra(t *testing.T) {
 
 	stmt = Statement{
 		Type:  SqlInsert,
-		Table: Table{"table name"},
+		Table: Table{"table_name"},
 		Extra: "RETURNING id",
 		Columns: Columns{
 			Column{"foo"},
@@ -583,7 +583,7 @@ func TestInsertExtra(t *testing.T) {
 	}
 
 	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 {
 		t.Fatalf("Got: %s, Expecting: %s", s, e)
diff --git a/util/sqlgen/table.go b/util/sqlgen/table.go
index 41e93084..4802b892 100644
--- a/util/sqlgen/table.go
+++ b/util/sqlgen/table.go
@@ -8,6 +8,7 @@ import (
 var (
 	reTableSeparator = regexp.MustCompile(`\s*?,\s*?`)
 	reAliasSeparator = regexp.MustCompile(`(?i:\s+AS\s+)`)
+	reSpaceSeparator = regexp.MustCompile(`\s+`)
 )
 
 type table_t struct {
@@ -24,6 +25,10 @@ func quotedTableName(layout *Template, input string) string {
 
 	chunks := reAliasSeparator.Split(input, 2)
 
+	if len(chunks) == 1 {
+		chunks = reSpaceSeparator.Split(input, 2)
+	}
+
 	name := chunks[0]
 
 	nameChunks := strings.SplitN(name, layout.ColumnSeparator, 2)
diff --git a/util/sqlgen/table_test.go b/util/sqlgen/table_test.go
index e647f78a..d6a88c73 100644
--- a/util/sqlgen/table_test.go
+++ b/util/sqlgen/table_test.go
@@ -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) {
 	var s, e string
 	var table Table
-- 
GitLab