2025-02-13 14:48:46 +01:00
|
|
|
import unittest
|
|
|
|
|
2025-02-13 15:00:13 +01:00
|
|
|
from sqlglot import exp, parse_one, to_table
|
2025-02-13 14:53:05 +01:00
|
|
|
from sqlglot.errors import SchemaError
|
2025-02-13 14:48:46 +01:00
|
|
|
from sqlglot.schema import MappingSchema, ensure_schema
|
|
|
|
|
|
|
|
|
|
|
|
class TestSchema(unittest.TestCase):
|
2025-02-13 14:53:05 +01:00
|
|
|
def assert_column_names(self, schema, *table_results):
|
|
|
|
for table, result in table_results:
|
|
|
|
with self.subTest(f"{table} -> {result}"):
|
|
|
|
self.assertEqual(schema.column_names(to_table(table)), result)
|
2025-02-13 14:48:46 +01:00
|
|
|
|
2025-02-13 14:53:05 +01:00
|
|
|
def assert_column_names_raises(self, schema, *tables):
|
|
|
|
for table in tables:
|
|
|
|
with self.subTest(table):
|
|
|
|
with self.assertRaises(SchemaError):
|
|
|
|
schema.column_names(to_table(table))
|
2025-02-13 14:48:46 +01:00
|
|
|
|
2025-02-13 14:53:05 +01:00
|
|
|
def test_schema(self):
|
|
|
|
schema = ensure_schema(
|
2025-02-13 14:48:46 +01:00
|
|
|
{
|
|
|
|
"x": {
|
|
|
|
"a": "uint64",
|
|
|
|
},
|
|
|
|
"y": {
|
2025-02-13 14:53:05 +01:00
|
|
|
"b": "uint64",
|
|
|
|
"c": "uint64",
|
2025-02-13 14:48:46 +01:00
|
|
|
},
|
|
|
|
},
|
|
|
|
)
|
|
|
|
|
2025-02-13 14:53:05 +01:00
|
|
|
self.assert_column_names(
|
|
|
|
schema,
|
|
|
|
("x", ["a"]),
|
|
|
|
("y", ["b", "c"]),
|
|
|
|
("z.x", ["a"]),
|
|
|
|
("z.x.y", ["b", "c"]),
|
2025-02-13 14:48:46 +01:00
|
|
|
)
|
|
|
|
|
2025-02-13 14:53:05 +01:00
|
|
|
self.assert_column_names_raises(
|
|
|
|
schema,
|
|
|
|
"z",
|
|
|
|
"z.z",
|
|
|
|
"z.z.z",
|
|
|
|
)
|
2025-02-13 14:48:46 +01:00
|
|
|
|
2025-02-13 14:53:05 +01:00
|
|
|
def test_schema_db(self):
|
|
|
|
schema = ensure_schema(
|
2025-02-13 14:48:46 +01:00
|
|
|
{
|
2025-02-13 14:53:05 +01:00
|
|
|
"d1": {
|
2025-02-13 14:48:46 +01:00
|
|
|
"x": {
|
|
|
|
"a": "uint64",
|
|
|
|
},
|
|
|
|
"y": {
|
2025-02-13 14:53:05 +01:00
|
|
|
"b": "uint64",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
"d2": {
|
|
|
|
"x": {
|
|
|
|
"c": "uint64",
|
2025-02-13 14:48:46 +01:00
|
|
|
},
|
2025-02-13 14:53:05 +01:00
|
|
|
},
|
2025-02-13 14:48:46 +01:00
|
|
|
},
|
|
|
|
)
|
|
|
|
|
2025-02-13 14:53:05 +01:00
|
|
|
self.assert_column_names(
|
|
|
|
schema,
|
|
|
|
("d1.x", ["a"]),
|
|
|
|
("d2.x", ["c"]),
|
|
|
|
("y", ["b"]),
|
|
|
|
("d1.y", ["b"]),
|
|
|
|
("z.d1.y", ["b"]),
|
2025-02-13 14:48:46 +01:00
|
|
|
)
|
|
|
|
|
2025-02-13 14:53:05 +01:00
|
|
|
self.assert_column_names_raises(
|
|
|
|
schema,
|
|
|
|
"x",
|
|
|
|
"z.x",
|
|
|
|
"z.y",
|
|
|
|
)
|
2025-02-13 14:48:46 +01:00
|
|
|
|
2025-02-13 14:53:05 +01:00
|
|
|
def test_schema_catalog(self):
|
|
|
|
schema = ensure_schema(
|
2025-02-13 14:48:46 +01:00
|
|
|
{
|
2025-02-13 14:53:05 +01:00
|
|
|
"c1": {
|
|
|
|
"d1": {
|
2025-02-13 14:48:46 +01:00
|
|
|
"x": {
|
|
|
|
"a": "uint64",
|
|
|
|
},
|
|
|
|
"y": {
|
2025-02-13 14:53:05 +01:00
|
|
|
"b": "uint64",
|
2025-02-13 14:48:46 +01:00
|
|
|
},
|
2025-02-13 14:53:05 +01:00
|
|
|
"z": {
|
|
|
|
"c": "uint64",
|
2025-02-13 14:48:46 +01:00
|
|
|
},
|
2025-02-13 14:53:05 +01:00
|
|
|
},
|
|
|
|
},
|
|
|
|
"c2": {
|
|
|
|
"d1": {
|
2025-02-13 14:48:46 +01:00
|
|
|
"y": {
|
2025-02-13 14:53:05 +01:00
|
|
|
"d": "uint64",
|
2025-02-13 14:48:46 +01:00
|
|
|
},
|
|
|
|
"z": {
|
2025-02-13 14:53:05 +01:00
|
|
|
"e": "uint64",
|
2025-02-13 14:48:46 +01:00
|
|
|
},
|
|
|
|
},
|
2025-02-13 14:53:05 +01:00
|
|
|
"d2": {
|
2025-02-13 14:48:46 +01:00
|
|
|
"z": {
|
2025-02-13 14:53:05 +01:00
|
|
|
"f": "uint64",
|
|
|
|
},
|
2025-02-13 14:48:46 +01:00
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
2025-02-13 14:53:05 +01:00
|
|
|
self.assert_column_names(
|
|
|
|
schema,
|
|
|
|
("x", ["a"]),
|
|
|
|
("d1.x", ["a"]),
|
|
|
|
("c1.d1.x", ["a"]),
|
|
|
|
("c1.d1.y", ["b"]),
|
|
|
|
("c1.d1.z", ["c"]),
|
|
|
|
("c2.d1.y", ["d"]),
|
|
|
|
("c2.d1.z", ["e"]),
|
|
|
|
("d2.z", ["f"]),
|
|
|
|
("c2.d2.z", ["f"]),
|
2025-02-13 14:48:46 +01:00
|
|
|
)
|
2025-02-13 14:53:05 +01:00
|
|
|
|
|
|
|
self.assert_column_names_raises(
|
|
|
|
schema,
|
|
|
|
"q",
|
|
|
|
"d2.x",
|
|
|
|
"y",
|
|
|
|
"z",
|
|
|
|
"d1.y",
|
|
|
|
"d1.z",
|
|
|
|
"a.b.c",
|
2025-02-13 14:48:46 +01:00
|
|
|
)
|
|
|
|
|
|
|
|
def test_schema_add_table_with_and_without_mapping(self):
|
|
|
|
schema = MappingSchema()
|
|
|
|
schema.add_table("test")
|
|
|
|
self.assertEqual(schema.column_names("test"), [])
|
|
|
|
schema.add_table("test", {"x": "string"})
|
|
|
|
self.assertEqual(schema.column_names("test"), ["x"])
|
|
|
|
schema.add_table("test", {"x": "string", "y": "int"})
|
|
|
|
self.assertEqual(schema.column_names("test"), ["x", "y"])
|
|
|
|
schema.add_table("test")
|
|
|
|
self.assertEqual(schema.column_names("test"), ["x", "y"])
|
2025-02-13 14:53:05 +01:00
|
|
|
|
|
|
|
def test_schema_get_column_type(self):
|
|
|
|
schema = MappingSchema({"a": {"b": "varchar"}})
|
2025-02-13 14:58:37 +01:00
|
|
|
self.assertEqual(schema.get_column_type("a", "b").this, exp.DataType.Type.VARCHAR)
|
2025-02-13 14:53:05 +01:00
|
|
|
self.assertEqual(
|
2025-02-13 14:58:37 +01:00
|
|
|
schema.get_column_type(exp.Table(this="a"), exp.Column(this="b")).this,
|
2025-02-13 14:53:05 +01:00
|
|
|
exp.DataType.Type.VARCHAR,
|
|
|
|
)
|
|
|
|
self.assertEqual(
|
2025-02-13 14:58:37 +01:00
|
|
|
schema.get_column_type("a", exp.Column(this="b")).this, exp.DataType.Type.VARCHAR
|
2025-02-13 14:53:05 +01:00
|
|
|
)
|
|
|
|
self.assertEqual(
|
2025-02-13 14:58:37 +01:00
|
|
|
schema.get_column_type(exp.Table(this="a"), "b").this, exp.DataType.Type.VARCHAR
|
2025-02-13 14:53:05 +01:00
|
|
|
)
|
|
|
|
schema = MappingSchema({"a": {"b": {"c": "varchar"}}})
|
|
|
|
self.assertEqual(
|
2025-02-13 14:58:37 +01:00
|
|
|
schema.get_column_type(exp.Table(this="b", db="a"), exp.Column(this="c")).this,
|
2025-02-13 14:53:05 +01:00
|
|
|
exp.DataType.Type.VARCHAR,
|
|
|
|
)
|
|
|
|
self.assertEqual(
|
2025-02-13 14:58:37 +01:00
|
|
|
schema.get_column_type(exp.Table(this="b", db="a"), "c").this, exp.DataType.Type.VARCHAR
|
2025-02-13 14:53:05 +01:00
|
|
|
)
|
|
|
|
schema = MappingSchema({"a": {"b": {"c": {"d": "varchar"}}}})
|
|
|
|
self.assertEqual(
|
2025-02-13 14:58:37 +01:00
|
|
|
schema.get_column_type(
|
|
|
|
exp.Table(this="c", db="b", catalog="a"), exp.Column(this="d")
|
|
|
|
).this,
|
2025-02-13 14:53:05 +01:00
|
|
|
exp.DataType.Type.VARCHAR,
|
|
|
|
)
|
|
|
|
self.assertEqual(
|
2025-02-13 14:58:37 +01:00
|
|
|
schema.get_column_type(exp.Table(this="c", db="b", catalog="a"), "d").this,
|
2025-02-13 14:53:05 +01:00
|
|
|
exp.DataType.Type.VARCHAR,
|
|
|
|
)
|
2025-02-13 15:00:13 +01:00
|
|
|
|
|
|
|
schema = MappingSchema({"foo": {"bar": parse_one("INT", into=exp.DataType)}})
|
|
|
|
self.assertEqual(schema.get_column_type("foo", "bar").this, exp.DataType.Type.INT)
|