This is an automated email from the ASF dual-hosted git repository. richardantal pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/phoenix-queryserver.git
The following commit(s) were added to refs/heads/master by this push: new be87049 PHOENIX-6407 phoenixdb for Python silently ignores placeholders < placeholder arguments be87049 is described below commit be87049439b48cf38338b671d96e3df1bf983ac8 Author: Richard Antal <richard.an...@cloudera.com> AuthorDate: Wed Jul 7 15:34:37 2021 +0200 PHOENIX-6407 phoenixdb for Python silently ignores placeholders < placeholder arguments Change-Id: I1715aca93420686585d5c6d4db7994c74bd39cba --- python-phoenixdb/phoenixdb/cursor.py | 2 ++ python-phoenixdb/phoenixdb/tests/test_db.py | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/python-phoenixdb/phoenixdb/cursor.py b/python-phoenixdb/phoenixdb/cursor.py index e716115..0f1ace2 100644 --- a/python-phoenixdb/phoenixdb/cursor.py +++ b/python-phoenixdb/phoenixdb/cursor.py @@ -174,6 +174,8 @@ class Cursor(object): return self._process_result(results[0]) def _transform_parameters(self, parameters): + if len(parameters) != len(self._parameter_data_types): + raise ProgrammingError('Number of placeholders (?) must match number of parameters. Number of placeholders: {0}. Number of parameters: {1}'.format(len(self._parameter_data_types), len(parameters))) typed_parameters = [] for value, data_type in zip(parameters, self._parameter_data_types): field_name, rep, mutate_to, cast_from, is_array = data_type diff --git a/python-phoenixdb/phoenixdb/tests/test_db.py b/python-phoenixdb/phoenixdb/tests/test_db.py index 0c04b11..3056a6b 100644 --- a/python-phoenixdb/phoenixdb/tests/test_db.py +++ b/python-phoenixdb/phoenixdb/tests/test_db.py @@ -285,3 +285,21 @@ class PhoenixDatabaseTest(DatabaseTestCase): cursor.execute('drop table if exists AAA') cursor.execute('drop table if exists "aaa"') cursor.execute('drop table if exists "Aaa"') + + def test_param_number_mismatch(self): + self.createTable("phoenixdb_test_param_number", "CREATE TABLE {table} (id INTEGER PRIMARY KEY, username VARCHAR, name VARCHAR)") + with self.conn.cursor() as cursor: + cursor.execute("UPSERT INTO phoenixdb_test_param_number VALUES (?, ?, ?)", (123, 'John Doe', 'Doe')) + cursor.execute("SELECT * FROM phoenixdb_test_param_number") + self.assertEqual(cursor.fetchall(), [ + [123, 'John Doe', 'Doe'] + ]) + with self.assertRaises(ProgrammingError) as cm: + cursor.execute("UPSERT INTO phoenixdb_test_param_number VALUES (?, ?)", (123, 'John Doe', 'admin')) + self.assertEqual("Number of placeholders (?) must match number of parameters. Number of placeholders: 2. Number of parameters: 3", cm.exception.message) + with self.assertRaises(ProgrammingError) as cm: + cursor.execute("UPSERT INTO phoenixdb_test_param_number VALUES (?, ?, ?)", (123, 'John Doe', 'admin', 'asd')) + self.assertEqual("Number of placeholders (?) must match number of parameters. Number of placeholders: 3. Number of parameters: 4", cm.exception.message) + with self.assertRaises(ProgrammingError) as cm: + cursor.execute("UPSERT INTO phoenixdb_test_param_number VALUES (?, ?, ?)", (123, 'John Doe')) + self.assertEqual("Number of placeholders (?) must match number of parameters. Number of placeholders: 3. Number of parameters: 2", cm.exception.message)