diff --git a/src/PostgREST/QueryBuilder.hs b/src/PostgREST/QueryBuilder.hs index 736c4e17a..a84ce11ff 100644 --- a/src/PostgREST/QueryBuilder.hs +++ b/src/PostgREST/QueryBuilder.hs @@ -97,11 +97,11 @@ createReadStatement selectQuery countQuery isSingle countTotal asCsv = where sql = [qc| WITH {sourceCTEName} AS ({selectQuery}) SELECT {cols} - FROM ( SELECT * FROM {sourceCTEName}) t |] + FROM ( SELECT * FROM {sourceCTEName}) _postgrest_t |] countResultF = if countTotal then "("<>countQuery<>")" else "null" cols = intercalate ", " [ countResultF <> " AS total_result_set", - "pg_catalog.count(t) AS page_total", + "pg_catalog.count(_postgrest_t) AS page_total", noLocationF <> " AS header", bodyF <> " AS body" ] @@ -129,10 +129,10 @@ createWriteStatement qi _ mutateQuery isSingle HeadersOnly sql = [qc| WITH {sourceCTEName} AS ({mutateQuery} RETURNING {fromQi qi}.*) SELECT {cols} - FROM (SELECT 1 FROM {sourceCTEName}) t |] + FROM (SELECT 1 FROM {sourceCTEName}) _postgrest_t |] cols = intercalate ", " [ "'' AS total_result_set", - "pg_catalog.count(t) AS page_total", + "pg_catalog.count(_postgrest_t) AS page_total", if isSingle then locationF pKeys else noLocationF, "''" ] @@ -144,10 +144,10 @@ createWriteStatement qi selectQuery mutateQuery isSingle Full sql = [qc| WITH {sourceCTEName} AS ({mutateQuery} RETURNING {fromQi qi}.*) SELECT {cols} - FROM ({selectQuery}) t |] + FROM ({selectQuery}) _postgrest_t |] cols = intercalate ", " [ "'' AS total_result_set", -- when updateing it does not make sense - "pg_catalog.count(t) AS page_total", + "pg_catalog.count(_postgrest_t) AS page_total", if isSingle then locationF pKeys else noLocationF <> " AS header", bodyF <> " AS body" ] @@ -205,15 +205,15 @@ callProc qi params selectQuery countQuery _ countTotal isSingle = WITH {sourceCTEName} AS ({_callSql}) SELECT {countResultF} AS total_result_set, - pg_catalog.count(t) AS page_total, + pg_catalog.count(_postgrest_t) AS page_total, case when pg_catalog.count(1) > 1 then {bodyF} else - coalesce(((array_agg(row_to_json(t)))[1]->{_procName})::character varying, {bodyF}) + coalesce(((array_agg(row_to_json(_postgrest_t)))[1]->{_procName})::character varying, {bodyF}) end as body - FROM ({selectQuery}) t; + FROM ({selectQuery}) _postgrest_t; |] -- FROM (select * from {sourceCTEName} {limitF range}) t; countResultF = if countTotal then "("<>countQuery<>")" else "null::bigint" :: Text @@ -397,13 +397,13 @@ asCsvF = asCsvHeaderF <> " || '\n' || " <> asCsvBodyF " ) s" <> " ) a" <> ")" - asCsvBodyF = "coalesce(string_agg(substring(t::text, 2, length(t::text) - 2), '\n'), '')" + asCsvBodyF = "coalesce(string_agg(substring(_postgrest_t::text, 2, length(_postgrest_t::text) - 2), '\n'), '')" asJsonF :: SqlFragment -asJsonF = "coalesce(array_to_json(array_agg(row_to_json(t))), '[]')::character varying" +asJsonF = "coalesce(array_to_json(array_agg(row_to_json(_postgrest_t))), '[]')::character varying" asJsonSingleF :: SqlFragment --TODO! unsafe when the query actually returns multiple rows, used only on inserting and returning single element -asJsonSingleF = "coalesce(string_agg(row_to_json(t)::text, ','), '')::character varying " +asJsonSingleF = "coalesce(string_agg(row_to_json(_postgrest_t)::text, ','), '')::character varying " locationF :: [Text] -> SqlFragment locationF pKeys = diff --git a/test/Feature/QuerySpec.hs b/test/Feature/QuerySpec.hs index a318967db..ac39f60b6 100644 --- a/test/Feature/QuerySpec.hs +++ b/test/Feature/QuerySpec.hs @@ -17,6 +17,10 @@ spec = do it "should not confuse count column with pg_catalog.count aggregate" $ get "/has_count_column" `shouldRespondWith` 200 + describe "Querying a table with a column called t" $ + it "should not conflict with internal postgrest table alias" $ + get "/clashing_column?select=t" `shouldRespondWith` 200 + describe "Querying a nonexistent table" $ it "causes a 404" $ get "/faketable" `shouldRespondWith` 404 diff --git a/test/fixtures/privileges.sql b/test/fixtures/privileges.sql index 853d4189d..2e9c5d225 100644 --- a/test/fixtures/privileges.sql +++ b/test/fixtures/privileges.sql @@ -38,6 +38,7 @@ GRANT ALL ON TABLE , "Escap3e;" , "ghostBusters" , "withUnique" + , "clashing_column" , "موارد" , addresses , orders diff --git a/test/fixtures/schema.sql b/test/fixtures/schema.sql index bc3973cc9..7f81a58ac 100755 --- a/test/fixtures/schema.sql +++ b/test/fixtures/schema.sql @@ -703,6 +703,10 @@ CREATE TABLE "withUnique" ( extra text ); +CREATE TABLE clashing_column ( + t text +); + -- -- Name: id; Type: DEFAULT; Schema: test; Owner: -