ActiveRecordExtended icon indicating copy to clipboard operation
ActiveRecordExtended copied to clipboard

CTE with values does not work

Open yasirazgar opened this issue 2 years ago • 0 comments

Ex:

cte = { "user_names(name)" => "values('jimmy'),('tommy'),('gummy')" }

User.with(cte).joins("JOIN user_names ON users.name = user_names.name").order(:name).to_a

ActiveRecord -- User Load -- { :sql => "WITH \"user_names(name)\" AS (values('jimmy'),('tommy'),('gummy')) SELECT \"users\".* FROM \"users\" JOIN user_names ON users.name = user_names.name ORDER BY \"users\".\"name\" ASC", :allocations => 909, :cached => nil }

ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR:  relation "user_names" does not exist
LINE 1: ...y'),('gummy')) SELECT "users".* FROM "users" JOIN user_names...
                                                             ^

Generated SQL:

 User.with(cte).joins("JOIN user_names ON users.name = user_names.name").order(:name).to_sql

Actual SQL - Errored

"WITH \"user_names(name)\" AS (values('jimmy'),('tommy'),('gummy')) SELECT \"users\".* FROM \"users\" JOIN user_names ON users.name = user_names.name ORDER BY \"users\".\"name\" ASC"

Expected SQL

"WITH user_names(name) AS (values('jimmy'),('tommy'),('gummy')) SELECT \"users\".* FROM \"users\" JOIN user_names ON users.name = user_names.name ORDER BY \"users\".\"name\" ASC"

Observation: As the cte name is quoted, it raise PG::UndefinedTable

Fix: Try to avoid quoting when cte name/key is of such format, one of the way is to look for ( and ) inside the key.

yasirazgar avatar Aug 09 '22 10:08 yasirazgar