[FIX] sql_db: ignore PG views when verifying table type

Collisions in table names of ORM models with built-in PG structures such
as "attributes", "domains", "routines", "parameters", ... could occur
and render the result of `table_kind` meaningless.

Based on what was done via https://github.com/odoo/odoo/pull/16651 more
than 2 years ago, it seems relying on our tables being in the 'public'
schema is safe, even though it's only a default from PG. We reuse that
same logic rather than the alternative of excluding
('information_schema', 'pg_catalog', ...), even though it looks safer at
first. If we did the latter we'd have to change the other comparison for
consistency, i.e. more risks.

closes odoo/odoo#42358

X-original-commit: d8e74eb14990c82f65a44ffe163aa84159d6ccc4
Signed-off-by: Denis Vermylen <Icallhimtest@users.noreply.github.com>
This commit is contained in:
Denis Vermylen
2019-12-24 19:08:11 +00:00
parent 193040ada2
commit cf0146934d
+7 -1
View File
@@ -38,7 +38,13 @@ def table_kind(cr, tablename):
``'f'`` (foreign table), ``'t'`` (temporary table),
``'m'`` (materialized view), or ``None``.
"""
query = "SELECT relkind FROM pg_class WHERE relname = %s"
query = """
SELECT c.relkind
FROM pg_class c
JOIN pg_namespace n ON (n.oid = c.relnamespace)
WHERE c.relname = %s
AND n.nspname = 'public'
"""
cr.execute(query, (tablename,))
return cr.fetchone()[0] if cr.rowcount else None