Skip to content

Commit

Permalink
Merge pull request #992 from fishtown-analytics/fix/errors-on-null-sc…
Browse files Browse the repository at this point in the history
…hema

Fix errors on null schema (#980)
  • Loading branch information
beckjake authored Sep 11, 2018
2 parents 6e62058 + 13ebfdf commit 5c2fa70
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 6 deletions.
25 changes: 19 additions & 6 deletions dbt/adapters/default/impl.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,24 @@
connections_available = []


def _filter_schemas(manifest):
"""Return a function that takes a row and decides if the row should be
included in the catalog output.
"""
schemas = frozenset({
node.schema.lower()
for node in manifest.nodes.values()
})

def test(row):
# the schema may be present but None
table_schema = row.get('table_schema')
if table_schema is None:
return False
return table_schema.lower() in schemas
return test


class DefaultAdapter(object):
DEFAULT_QUOTE = True

Expand Down Expand Up @@ -830,10 +848,5 @@ def get_catalog(cls, profile, project_cfg, manifest):
finally:
cls.release_connection(profile, GET_CATALOG_OPERATION_NAME)

schemas = list({
node.schema.lower()
for node in manifest.nodes.values()
})

results = table.where(lambda r: r['table_schema'].lower() in schemas)
results = table.where(_filter_schemas(manifest))
return results
29 changes: 29 additions & 0 deletions test/unit/test_postgres_adapter.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
from dbt.adapters.postgres import PostgresAdapter
from dbt.exceptions import ValidationException
from dbt.logger import GLOBAL_LOGGER as logger # noqa
import agate


class TestPostgresAdapter(unittest.TestCase):
Expand Down Expand Up @@ -79,3 +80,31 @@ def test_set_zero_keepalive(self, psycopg2):
port=5432,
connect_timeout=10)

@mock.patch.object(PostgresAdapter, 'run_operation')
def test_get_catalog_various_schemas(self, mock_run):
column_names = ['table_schema', 'table_name']
rows = [
('foo', 'bar'),
('FOO', 'baz'),
(None, 'bar'),
('quux', 'bar'),
('skip', 'bar')
]
mock_run.return_value = agate.Table(rows=rows,
column_names=column_names)

# we should accept the lowercase matching 'foo's only.
mock_nodes = [
mock.MagicMock(spec_set=['schema'], schema='foo')
for k in range(2)
]
mock_nodes.append(mock.MagicMock(spec_set=['schema'], schema='quux'))
nodes = {str(idx): n for idx, n in enumerate(mock_nodes)}
# give manifest the dict it wants
mock_manifest = mock.MagicMock(spec_set=['nodes'], nodes=nodes)

catalog = PostgresAdapter.get_catalog({}, {}, mock_manifest)
self.assertEqual(
set(map(tuple, catalog)),
{('foo', 'bar'), ('FOO', 'baz'), ('quux', 'bar')}
)

0 comments on commit 5c2fa70

Please sign in to comment.