diff options
author | Douglas Barbosa Alexandre <dbalexandre@gmail.com> | 2019-02-11 17:36:57 -0200 |
---|---|---|
committer | Douglas Barbosa Alexandre <dbalexandre@gmail.com> | 2019-02-11 18:06:54 -0200 |
commit | 9100ca188c45f2129d5e891534ed38718ef67e46 (patch) | |
tree | 69d9c170947fc4c2e3f1009386ec1762a5024509 | |
parent | a1215556ec6c5ab84862519b82cee99645dad357 (diff) | |
download | gitlab-ce-9100ca188c45f2129d5e891534ed38718ef67e46.tar.gz |
Replace dots with an underscore when creating an alias for the CTE
When the Arel table to use as the alias contains a schema in your
name, e.g., "gitlab_secondary"."namespaces" it produces an invalid
query.
-rw-r--r-- | lib/gitlab/sql/recursive_cte.rb | 2 | ||||
-rw-r--r-- | spec/lib/gitlab/sql/recursive_cte_spec.rb | 9 |
2 files changed, 10 insertions, 1 deletions
diff --git a/lib/gitlab/sql/recursive_cte.rb b/lib/gitlab/sql/recursive_cte.rb index ec1f00a3a91..e45ac5d4765 100644 --- a/lib/gitlab/sql/recursive_cte.rb +++ b/lib/gitlab/sql/recursive_cte.rb @@ -48,7 +48,7 @@ module Gitlab # # alias_table - The Arel table to use as the alias. def alias_to(alias_table) - Arel::Nodes::As.new(table, alias_table) + Arel::Nodes::As.new(table, Arel::Table.new(alias_table.name.tr('.', '_'))) end # Applies the CTE to the given relation, returning a new one that will diff --git a/spec/lib/gitlab/sql/recursive_cte_spec.rb b/spec/lib/gitlab/sql/recursive_cte_spec.rb index 25146860615..7fe39dd5a96 100644 --- a/spec/lib/gitlab/sql/recursive_cte_spec.rb +++ b/spec/lib/gitlab/sql/recursive_cte_spec.rb @@ -31,6 +31,15 @@ describe Gitlab::SQL::RecursiveCTE, :postgresql do expect(cte.alias_to(table).to_sql).to eq("#{source_name} AS #{alias_name}") end + + it 'replaces dots with an underscore' do + table = Arel::Table.new('gitlab.kittens') + + source_name = ActiveRecord::Base.connection.quote_table_name(:cte_name) + alias_name = ActiveRecord::Base.connection.quote_table_name(:gitlab_kittens) + + expect(cte.alias_to(table).to_sql).to eq("#{source_name} AS #{alias_name}") + end end describe '#apply_to' do |