@@ -29,6 +29,10 @@ public struct Query {
2929 internal var database : Database
3030
3131 internal init ( _ database: Database , _ tableName: String ) {
32+ ( self . database, self . tableName) = ( database, Expression ( tableName) )
33+ }
34+
35+ private init ( _ database: Database , _ tableName: Expression < ( ) > ) {
3236 ( self . database, self . tableName) = ( database, tableName)
3337 }
3438
@@ -50,17 +54,16 @@ public struct Query {
5054
5155 private var columns : [ Expressible ] = [ Expression < ( ) > ( literal: " * " ) ]
5256 private var distinct : Bool = false
53- internal var tableName : String
54- private var alias : String ?
57+ internal var tableName : Expression < ( ) >
5558 private var joins : [ ( type: JoinType , table: Query , condition: Expression < Bool > ) ] = [ ]
5659 private var filter : Expression < Bool > ?
5760 private var group : Expressible ?
5861 private var order = [ Expressible] ( )
5962 private var limit : ( to: Int , offset: Int ? ) ? = nil
6063
61- public func alias( alias: String ? ) -> Query {
64+ public func alias( alias: String ) -> Query {
6265 var query = self
63- query. alias = alias
66+ query. tableName = query . tableName . alias ( alias )
6467 return query
6568 }
6669
@@ -293,7 +296,7 @@ public struct Query {
293296 /// :returns: A column expression namespaced with the query’s table name or
294297 /// alias.
295298 public func namespace< V> ( column: Expression < V > ) -> Expression < V > {
296- return Expression ( literal : " \( quote ( identifier : alias ?? tableName ) ) . \( column . SQL ) " , column. bindings )
299+ return Expression ( . join ( " . " , [ tableName , column] ) )
297300 }
298301
299302 // FIXME: rdar://18673897 // ... subscript<T>(expression: Expression<V>) -> Expression<V>
@@ -361,7 +364,7 @@ public struct Query {
361364 private func insertStatement( values: [ Setter ] , or: OnConflict ? = nil ) -> Statement {
362365 var insertClause = " INSERT "
363366 if let or = or { insertClause = " \( insertClause) OR \( or. rawValue) " }
364- var expressions : [ Expressible ] = [ Expression < ( ) > ( literal: " \( insertClause) INTO \( quote ( identifier : tableName) ) " ) ]
367+ var expressions : [ Expressible ] = [ Expression < ( ) > ( literal: " \( insertClause) INTO \( tableName. unaliased . SQL ) " ) ]
365368 let ( c, v) = ( Expression < ( ) > . join ( " , " , values. map { $0. 0 } ) , Expression < ( ) > . join ( " , " , values. map { $0. 1 } ) )
366369 expressions. append ( Expression < ( ) > ( literal: " ( \( c. SQL) ) VALUES ( \( v. SQL) ) " , c. bindings + v. bindings) )
367370 whereClause. map ( expressions. append)
@@ -370,15 +373,15 @@ public struct Query {
370373 }
371374
372375 private func updateStatement( values: [ Setter ] ) -> Statement {
373- var expressions : [ Expressible ] = [ Expression < ( ) > ( literal: " UPDATE \( quote ( identifier : tableName) ) SET " ) ]
376+ var expressions : [ Expressible ] = [ Expression < ( ) > ( literal: " UPDATE \( tableName. unaliased . SQL ) SET " ) ]
374377 expressions. append ( Expression < ( ) > . join ( " , " , values. map { Expression < ( ) > . join ( " = " , [ $0, $1] ) } ) )
375378 whereClause. map ( expressions. append)
376379 let expression = Expression < ( ) > . join ( " " , expressions)
377380 return database. prepare ( expression. SQL, expression. bindings)
378381 }
379382
380383 private var deleteStatement : Statement {
381- var expressions : [ Expressible ] = [ Expression < ( ) > ( literal: " DELETE FROM \( quote ( identifier : tableName) ) " ) ]
384+ var expressions : [ Expressible ] = [ Expression < ( ) > ( literal: " DELETE FROM \( tableName. unaliased . SQL ) " ) ]
382385 whereClause. map ( expressions. append)
383386 let expression = Expression < ( ) > . join ( " " , expressions)
384387 return database. prepare ( expression. SQL, expression. bindings)
@@ -390,14 +393,14 @@ public struct Query {
390393 var expressions : [ Expressible ] = [ Expression < ( ) > ( literal: " SELECT " ) ]
391394 if distinct { expressions. append ( Expression < ( ) > ( literal: " DISTINCT " ) ) }
392395 expressions. append ( Expression < ( ) > . join ( " , " , columns. map { $0. expression. aliased } ) )
393- expressions. append ( Expression < ( ) > ( literal: " FROM \( self ) " ) )
396+ expressions. append ( Expression < ( ) > ( literal: " FROM \( tableName . aliased . SQL ) " ) )
394397 return Expression < ( ) > . join ( " " , expressions)
395398 }
396399
397400 private var joinClause : Expressible ? {
398401 if joins. count == 0 { return nil }
399402 return Expression < ( ) > . join ( " " , joins. map { type, table, condition in
400- Expression < ( ) > ( literal: " \( type. rawValue) JOIN \( table) ON \( condition. SQL) " , condition. bindings)
403+ Expression < ( ) > ( literal: " \( type. rawValue) JOIN \( table. tableName . aliased . SQL ) ON \( condition. SQL) " , condition. bindings)
401404 } )
402405 }
403406
@@ -473,7 +476,7 @@ public struct Query {
473476
474477 public func insert( query: Query ) -> ( changes: Int ? , statement: Statement ) {
475478 let expression = query. selectExpression
476- let statement = database. run ( " INSERT INTO \( quote ( identifier : tableName) ) \( expression. SQL) " , expression. bindings)
479+ let statement = database. run ( " INSERT INTO \( tableName. unaliased . SQL ) \( expression. SQL) " , expression. bindings)
477480 return ( statement. failed ? nil : database. lastChanges, statement)
478481 }
479482
@@ -482,7 +485,7 @@ public struct Query {
482485 public func insert( ) -> Statement { return insert ( ) . statement }
483486
484487 public func insert( ) -> ( id: Int64 ? , statement: Statement ) {
485- let statement = database. run ( " INSERT INTO \( quote ( identifier : tableName) ) DEFAULT VALUES " )
488+ let statement = database. run ( " INSERT INTO \( tableName. unaliased . SQL ) DEFAULT VALUES " )
486489 return ( statement. failed ? nil : database. lastId, statement)
487490 }
488491
@@ -827,8 +830,8 @@ public struct QueryGenerator: GeneratorType {
827830
828831 func expandGlob( namespace: Bool ) -> Query -> ( ) {
829832 return { table in
830- var names = self . query. database [ table . tableName] . selectStatement. columnNames. map { quote ( identifier: $0) }
831- if namespace { names = names. map { " \( quote ( identifier : table. alias ?? table . tableName) ) . \( $0) " } }
833+ var names = Query ( self . query. database, self . query . tableName. unaliased ) . selectStatement. columnNames. map { quote ( identifier: $0) }
834+ if namespace { names = names. map { " \( table. tableName. SQL ) . \( $0) " } }
832835 for name in names { columnNames [ name] = idx++ }
833836 }
834837 }
@@ -837,7 +840,7 @@ public struct QueryGenerator: GeneratorType {
837840 let tables = [ self . query] + self . query. joins. map { $0. table }
838841 if let tableName = tableName {
839842 for table in tables {
840- if quote ( identifier : table. alias ?? table . tableName) == tableName {
843+ if table. tableName. SQL == tableName {
841844 expandGlob ( true ) ( table)
842845 continue column
843846 }
@@ -867,8 +870,7 @@ public struct QueryGenerator: GeneratorType {
867870extension Query : Printable {
868871
869872 public var description : String {
870- if let alias = alias { return " \( quote ( identifier: tableName) ) AS \( quote ( identifier: alias) ) " }
871- return quote ( identifier: tableName)
873+ return tableName. SQL
872874 }
873875
874876}
0 commit comments