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)

Reply via email to