From 321d968504e8320070b1663fdbfc1f927014f788 Mon Sep 17 00:00:00 2001 From: Ethan M Lewis Date: Thu, 31 Aug 2023 10:23:32 -0700 Subject: [PATCH] fix: add format for timestamp in crdb to correctly use times values (#24711) Co-authored-by: John Bodley <4567245+john-bodley@users.noreply.github.com> --- superset/db_engine_specs/cockroachdb.py | 17 +++++++- tests/unit_tests/db_engine_specs/test_crdb.py | 40 +++++++++++++++++++ 2 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 tests/unit_tests/db_engine_specs/test_crdb.py diff --git a/superset/db_engine_specs/cockroachdb.py b/superset/db_engine_specs/cockroachdb.py index 8c83bd793..4486c569d 100644 --- a/superset/db_engine_specs/cockroachdb.py +++ b/superset/db_engine_specs/cockroachdb.py @@ -14,10 +14,25 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. +from datetime import datetime +from typing import Any, Optional + +from sqlalchemy import types + from superset.db_engine_specs.postgres import PostgresEngineSpec class CockroachDbEngineSpec(PostgresEngineSpec): engine = "cockroachdb" engine_name = "CockroachDB" - default_driver = "" + + @classmethod + def convert_dttm( + cls, target_type: str, dttm: datetime, db_extra: Optional[dict[str, Any]] = None + ) -> Optional[str]: + sqla_type = cls.get_sqla_column_type(target_type) + if isinstance(sqla_type, types.Date): + return f"'{dttm.date().isoformat()}'" + if isinstance(sqla_type, (types.String, types.DateTime)): + return f"""'{dttm.isoformat(sep=" ", timespec="seconds")}'""" + return None diff --git a/tests/unit_tests/db_engine_specs/test_crdb.py b/tests/unit_tests/db_engine_specs/test_crdb.py new file mode 100644 index 000000000..e2067d3c9 --- /dev/null +++ b/tests/unit_tests/db_engine_specs/test_crdb.py @@ -0,0 +1,40 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# pylint: disable=unused-argument, import-outside-toplevel, protected-access +from datetime import datetime +from typing import Optional + +import pytest + +from tests.unit_tests.db_engine_specs.utils import assert_convert_dttm +from tests.unit_tests.fixtures.common import dttm + + +@pytest.mark.parametrize( + "target_type,expected_result", + [ + ("Date", "'2019-01-02'"), + ("TimeStamp", "'2019-01-02 03:04:05'"), + ("UnknownType", None), + ], +) +def test_convert_dttm( + target_type: str, expected_result: Optional[str], dttm: datetime +) -> None: + from superset.db_engine_specs.cockroachdb import CockroachDbEngineSpec as spec + + assert_convert_dttm(spec, target_type, expected_result, dttm)