From 6bc640f4790bd4fd58e1b251aad23ada9177c39f Mon Sep 17 00:00:00 2001 From: Vincent Hsiao <124506982+fat-catTW@users.noreply.github.com> Date: Fri, 24 Jul 2026 13:29:13 +0000 Subject: [PATCH] Fix Teradata transfer template field initialization --- .../transfers/teradata_to_teradata.py | 4 +--- .../transfers/test_teradata_to_teradata.py | 19 +++++++++++++++++++ .../validate_operators_init_exemptions.txt | 1 - 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/providers/teradata/src/airflow/providers/teradata/transfers/teradata_to_teradata.py b/providers/teradata/src/airflow/providers/teradata/transfers/teradata_to_teradata.py index 126146cae365c..3fa10082dd89a 100644 --- a/providers/teradata/src/airflow/providers/teradata/transfers/teradata_to_teradata.py +++ b/providers/teradata/src/airflow/providers/teradata/transfers/teradata_to_teradata.py @@ -64,8 +64,6 @@ def __init__( **kwargs, ) -> None: super().__init__(**kwargs) - if sql_params is None: - sql_params = {} self.dest_teradata_conn_id = dest_teradata_conn_id self.destination_table = destination_table self.source_teradata_conn_id = source_teradata_conn_id @@ -86,7 +84,7 @@ def execute(self, context: Context) -> None: dest_hook = self.dest_hook with src_hook.get_conn() as src_conn: cursor = src_conn.cursor() - cursor.execute(self.sql, self.sql_params) + cursor.execute(self.sql, self.sql_params or {}) target_fields = [field[0] for field in cursor.description] rows_total = 0 if len(target_fields) != 0: diff --git a/providers/teradata/tests/unit/teradata/transfers/test_teradata_to_teradata.py b/providers/teradata/tests/unit/teradata/transfers/test_teradata_to_teradata.py index 023ca9e365118..385a12532b73d 100644 --- a/providers/teradata/tests/unit/teradata/transfers/test_teradata_to_teradata.py +++ b/providers/teradata/tests/unit/teradata/transfers/test_teradata_to_teradata.py @@ -77,6 +77,25 @@ def test_destination_hook(self): assert hook is op.dest_hook assert hook.teradata_conn_id == "dest_teradata_conn_id" + def test_sql_params_default_is_applied_at_execution(self, mocked_src_hook): + op = TeradataToTeradataOperator( + task_id="transfer_data", + dest_teradata_conn_id=self.dest_teradata_conn_id, + destination_table=self.destination_table, + source_teradata_conn_id=self.source_teradata_conn_id, + sql=self.sql, + ) + + assert op.sql_params is None + + mock_src_conn = mocked_src_hook.get_conn.return_value.__enter__.return_value + mock_cursor = mock_src_conn.cursor.return_value + mock_cursor.description.__iter__.return_value = [] + + op.execute({}) + + mock_cursor.execute.assert_called_once_with(self.sql, {}) + def test_execution(self, mocked_src_hook, mocked_dest_hook): cursor_description = [ ["user_id", Decimal, None, 8, 10, 0, False], diff --git a/scripts/ci/prek/validate_operators_init_exemptions.txt b/scripts/ci/prek/validate_operators_init_exemptions.txt index a4846a7da2e63..6659418602b10 100644 --- a/scripts/ci/prek/validate_operators_init_exemptions.txt +++ b/scripts/ci/prek/validate_operators_init_exemptions.txt @@ -70,5 +70,4 @@ providers/ssh/src/airflow/providers/ssh/operators/ssh_remote_job.py::SSHRemoteJo providers/standard/src/airflow/providers/standard/operators/bash.py::BashOperator providers/standard/src/airflow/providers/standard/operators/trigger_dagrun.py::TriggerDagRunOperator providers/standard/src/airflow/providers/standard/sensors/date_time.py::DateTimeSensor -providers/teradata/src/airflow/providers/teradata/transfers/teradata_to_teradata.py::TeradataToTeradataOperator providers/weaviate/src/airflow/providers/weaviate/operators/weaviate.py::WeaviateIngestOperator