Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-python-sql for 
openSUSE:Factory checked in at 2021-09-10 23:41:26
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-python-sql (Old)
 and      /work/SRC/openSUSE:Factory/.python-python-sql.new.1899 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-python-sql"

Fri Sep 10 23:41:26 2021 rev:6 rq:917909 version:1.2.2

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-python-sql/python-python-sql.changes      
2020-10-07 14:18:23.049480805 +0200
+++ 
/work/SRC/openSUSE:Factory/.python-python-sql.new.1899/python-python-sql.changes
    2021-09-10 23:41:49.794592496 +0200
@@ -1,0 +2,11 @@
+Fri Sep 10 07:14:18 UTC 2021 - pgaj...@suse.com
+
+- version update to 1.2.2
+  Version 1.2.2 - 2021-05-16
+  * Escape table and column names containing double quote
+  * Use alias on the main table used in UPDATE and INSERT
+  * Add support for Python 3.9
+  Version 1.2.1 - 2020-10-08
+  * Fix AttributeError in Select.params with windows
+
+-------------------------------------------------------------------

Old:
----
  python-sql-1.2.0.tar.gz

New:
----
  python-sql-1.2.2.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-python-sql.spec ++++++
--- /var/tmp/diff_new_pack.CsdQBq/_old  2021-09-10 23:41:50.266592998 +0200
+++ /var/tmp/diff_new_pack.CsdQBq/_new  2021-09-10 23:41:50.270593002 +0200
@@ -1,7 +1,7 @@
 #
-# spec file for package python-python-sql
+# spec file
 #
-# Copyright (c) 2020 SUSE LLC
+# Copyright (c) 2021 SUSE LLC
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -19,7 +19,7 @@
 %{?!python_module:%define python_module() python-%{**} python3-%{**}}
 %define base_name python-sql
 Name:           python-%{base_name}
-Version:        1.2.0
+Version:        1.2.2
 Release:        0
 Summary:        Library to write SQL queries
 License:        BSD-3-Clause
@@ -44,7 +44,9 @@
 %python_install
 
 %check
-%python_exec setup.py test
+mv sql sql_hide
+%pyunittest discover -v
+mv sql_hide sql
 
 %files %{python_files}
 %doc README

++++++ python-sql-1.2.0.tar.gz -> python-sql-1.2.2.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-sql-1.2.0/.drone.yml 
new/python-sql-1.2.2/.drone.yml
--- old/python-sql-1.2.0/.drone.yml     2020-10-02 21:26:48.000000000 +0200
+++ new/python-sql-1.2.2/.drone.yml     2021-05-09 09:36:27.000000000 +0200
@@ -27,6 +27,8 @@
           TOXENV: py37
         - IMAGE: python:3.8
           TOXENV: py38
+        - IMAGE: python:3.9
+          TOXENV: py39
         - IMAGE: pypy:2
           TOXENV: pypy
         - IMAGE: pypy:3
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-sql-1.2.0/.hgtags new/python-sql-1.2.2/.hgtags
--- old/python-sql-1.2.0/.hgtags        2020-10-05 18:37:13.000000000 +0200
+++ new/python-sql-1.2.2/.hgtags        2021-05-16 12:18:56.000000000 +0200
@@ -10,3 +10,5 @@
 7459778aa23150aa6ac39356621c29d368ae1f36 1.0.0
 194182e5b0e2dc6486a32778860f29c80c0672f9 1.1.0
 de68c850bc6a809b0c88ddbe2fa99b02df07bee3 1.2.0
+b2bcc0f71f6881316c11330c07de34113f088888 1.2.1
+1c38ffeacbb82a9ff6ae3568cdc017dbbeddff5d 1.2.2
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-sql-1.2.0/CHANGELOG 
new/python-sql-1.2.2/CHANGELOG
--- old/python-sql-1.2.0/CHANGELOG      2020-10-05 18:33:14.000000000 +0200
+++ new/python-sql-1.2.2/CHANGELOG      2021-05-16 12:17:30.000000000 +0200
@@ -1,3 +1,11 @@
+Version 1.2.2 - 2021-05-16
+* Escape table and column names containing double quote
+* Use alias on the main table used in UPDATE and INSERT
+* Add support for Python 3.9
+
+Version 1.2.1 - 2020-10-08
+* Fix AttributeError in Select.params with windows
+
 Version 1.2.0 - 2020-10-05
 * Add explicit Windows to Select
 * Fix missing Windows definitions in nested expressions
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-sql-1.2.0/PKG-INFO 
new/python-sql-1.2.2/PKG-INFO
--- old/python-sql-1.2.0/PKG-INFO       2020-10-05 18:37:51.000000000 +0200
+++ new/python-sql-1.2.2/PKG-INFO       2021-05-16 12:19:37.180865500 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 1.2
 Name: python-sql
-Version: 1.2.0
+Version: 1.2.2
 Summary: Library to write SQL queries
 Home-page: https://pypi.org/project/python-sql/
 Author: Tryton
@@ -118,36 +118,36 @@
         Insert query with default values::
         
             >>> tuple(user.insert())
-            ('INSERT INTO "user" DEFAULT VALUES', ())
+            ('INSERT INTO "user" AS "a" DEFAULT VALUES', ())
         
         Insert query with values::
         
             >>> tuple(user.insert(columns=[user.name, user.login],
             ...         values=[['Foo', 'foo']]))
-            ('INSERT INTO "user" ("name", "login") VALUES (%s, %s)', ('Foo', 
'foo'))
+            ('INSERT INTO "user" AS "a" ("name", "login") VALUES (%s, %s)', 
('Foo', 'foo'))
             >>> tuple(user.insert(columns=[user.name, user.login],
             ...         values=[['Foo', 'foo'], ['Bar', 'bar']]))
-            ('INSERT INTO "user" ("name", "login") VALUES (%s, %s), (%s, %s)', 
('Foo', 'foo', 'Bar', 'bar'))
+            ('INSERT INTO "user" AS "a" ("name", "login") VALUES (%s, %s), 
(%s, %s)', ('Foo', 'foo', 'Bar', 'bar'))
         
         Insert query with query::
         
             >>> passwd = Table('passwd')
             >>> select = passwd.select(passwd.login, passwd.passwd)
             >>> tuple(user.insert(values=select))
-            ('INSERT INTO "user" SELECT "a"."login", "a"."passwd" FROM 
"passwd" AS "a"', ())
+            ('INSERT INTO "user" AS "b" SELECT "a"."login", "a"."passwd" FROM 
"passwd" AS "a"', ())
         
         Update query with values::
         
             >>> tuple(user.update(columns=[user.active], values=[True]))
-            ('UPDATE "user" SET "active" = %s', (True,))
+            ('UPDATE "user" AS "a" SET "active" = %s', (True,))
             >>> tuple(invoice.update(columns=[invoice.total], 
values=[invoice.amount + invoice.tax]))
-            ('UPDATE "invoice" SET "total" = ("invoice"."amount" + 
"invoice"."tax")', ())
+            ('UPDATE "invoice" AS "a" SET "total" = ("a"."amount" + 
"a"."tax")', ())
         
         Update query with where condition::
         
             >>> tuple(user.update(columns=[user.active], values=[True],
             ...          where=user.active == False))
-            ('UPDATE "user" SET "active" = %s WHERE ("user"."active" = %s)', 
(True, False))
+            ('UPDATE "user" AS "a" SET "active" = %s WHERE ("a"."active" = 
%s)', (True, False))
         
         Update query with from list::
         
@@ -230,5 +230,6 @@
 Classifier: Programming Language :: Python :: 3.6
 Classifier: Programming Language :: Python :: 3.7
 Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
 Classifier: Topic :: Database
 Classifier: Topic :: Software Development :: Libraries :: Python Modules
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-sql-1.2.0/README new/python-sql-1.2.2/README
--- old/python-sql-1.2.0/README 2019-11-11 18:46:20.000000000 +0100
+++ new/python-sql-1.2.2/README 2021-05-09 09:36:27.000000000 +0200
@@ -106,36 +106,36 @@
 Insert query with default values::
 
     >>> tuple(user.insert())
-    ('INSERT INTO "user" DEFAULT VALUES', ())
+    ('INSERT INTO "user" AS "a" DEFAULT VALUES', ())
 
 Insert query with values::
 
     >>> tuple(user.insert(columns=[user.name, user.login],
     ...         values=[['Foo', 'foo']]))
-    ('INSERT INTO "user" ("name", "login") VALUES (%s, %s)', ('Foo', 'foo'))
+    ('INSERT INTO "user" AS "a" ("name", "login") VALUES (%s, %s)', ('Foo', 
'foo'))
     >>> tuple(user.insert(columns=[user.name, user.login],
     ...         values=[['Foo', 'foo'], ['Bar', 'bar']]))
-    ('INSERT INTO "user" ("name", "login") VALUES (%s, %s), (%s, %s)', ('Foo', 
'foo', 'Bar', 'bar'))
+    ('INSERT INTO "user" AS "a" ("name", "login") VALUES (%s, %s), (%s, %s)', 
('Foo', 'foo', 'Bar', 'bar'))
 
 Insert query with query::
 
     >>> passwd = Table('passwd')
     >>> select = passwd.select(passwd.login, passwd.passwd)
     >>> tuple(user.insert(values=select))
-    ('INSERT INTO "user" SELECT "a"."login", "a"."passwd" FROM "passwd" AS 
"a"', ())
+    ('INSERT INTO "user" AS "b" SELECT "a"."login", "a"."passwd" FROM "passwd" 
AS "a"', ())
 
 Update query with values::
 
     >>> tuple(user.update(columns=[user.active], values=[True]))
-    ('UPDATE "user" SET "active" = %s', (True,))
+    ('UPDATE "user" AS "a" SET "active" = %s', (True,))
     >>> tuple(invoice.update(columns=[invoice.total], values=[invoice.amount + 
invoice.tax]))
-    ('UPDATE "invoice" SET "total" = ("invoice"."amount" + "invoice"."tax")', 
())
+    ('UPDATE "invoice" AS "a" SET "total" = ("a"."amount" + "a"."tax")', ())
 
 Update query with where condition::
 
     >>> tuple(user.update(columns=[user.active], values=[True],
     ...          where=user.active == False))
-    ('UPDATE "user" SET "active" = %s WHERE ("user"."active" = %s)', (True, 
False))
+    ('UPDATE "user" AS "a" SET "active" = %s WHERE ("a"."active" = %s)', 
(True, False))
 
 Update query with from list::
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-sql-1.2.0/python_sql.egg-info/PKG-INFO 
new/python-sql-1.2.2/python_sql.egg-info/PKG-INFO
--- old/python-sql-1.2.0/python_sql.egg-info/PKG-INFO   2020-10-05 
18:37:50.000000000 +0200
+++ new/python-sql-1.2.2/python_sql.egg-info/PKG-INFO   2021-05-16 
12:19:36.000000000 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 1.2
 Name: python-sql
-Version: 1.2.0
+Version: 1.2.2
 Summary: Library to write SQL queries
 Home-page: https://pypi.org/project/python-sql/
 Author: Tryton
@@ -118,36 +118,36 @@
         Insert query with default values::
         
             >>> tuple(user.insert())
-            ('INSERT INTO "user" DEFAULT VALUES', ())
+            ('INSERT INTO "user" AS "a" DEFAULT VALUES', ())
         
         Insert query with values::
         
             >>> tuple(user.insert(columns=[user.name, user.login],
             ...         values=[['Foo', 'foo']]))
-            ('INSERT INTO "user" ("name", "login") VALUES (%s, %s)', ('Foo', 
'foo'))
+            ('INSERT INTO "user" AS "a" ("name", "login") VALUES (%s, %s)', 
('Foo', 'foo'))
             >>> tuple(user.insert(columns=[user.name, user.login],
             ...         values=[['Foo', 'foo'], ['Bar', 'bar']]))
-            ('INSERT INTO "user" ("name", "login") VALUES (%s, %s), (%s, %s)', 
('Foo', 'foo', 'Bar', 'bar'))
+            ('INSERT INTO "user" AS "a" ("name", "login") VALUES (%s, %s), 
(%s, %s)', ('Foo', 'foo', 'Bar', 'bar'))
         
         Insert query with query::
         
             >>> passwd = Table('passwd')
             >>> select = passwd.select(passwd.login, passwd.passwd)
             >>> tuple(user.insert(values=select))
-            ('INSERT INTO "user" SELECT "a"."login", "a"."passwd" FROM 
"passwd" AS "a"', ())
+            ('INSERT INTO "user" AS "b" SELECT "a"."login", "a"."passwd" FROM 
"passwd" AS "a"', ())
         
         Update query with values::
         
             >>> tuple(user.update(columns=[user.active], values=[True]))
-            ('UPDATE "user" SET "active" = %s', (True,))
+            ('UPDATE "user" AS "a" SET "active" = %s', (True,))
             >>> tuple(invoice.update(columns=[invoice.total], 
values=[invoice.amount + invoice.tax]))
-            ('UPDATE "invoice" SET "total" = ("invoice"."amount" + 
"invoice"."tax")', ())
+            ('UPDATE "invoice" AS "a" SET "total" = ("a"."amount" + 
"a"."tax")', ())
         
         Update query with where condition::
         
             >>> tuple(user.update(columns=[user.active], values=[True],
             ...          where=user.active == False))
-            ('UPDATE "user" SET "active" = %s WHERE ("user"."active" = %s)', 
(True, False))
+            ('UPDATE "user" AS "a" SET "active" = %s WHERE ("a"."active" = 
%s)', (True, False))
         
         Update query with from list::
         
@@ -230,5 +230,6 @@
 Classifier: Programming Language :: Python :: 3.6
 Classifier: Programming Language :: Python :: 3.7
 Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
 Classifier: Topic :: Database
 Classifier: Topic :: Software Development :: Libraries :: Python Modules
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-sql-1.2.0/setup.py 
new/python-sql-1.2.2/setup.py
--- old/python-sql-1.2.0/setup.py       2020-05-11 00:47:40.000000000 +0200
+++ new/python-sql-1.2.2/setup.py       2021-05-09 09:36:27.000000000 +0200
@@ -72,6 +72,7 @@
         'Programming Language :: Python :: 3.6',
         'Programming Language :: Python :: 3.7',
         'Programming Language :: Python :: 3.8',
+        'Programming Language :: Python :: 3.9',
         'Topic :: Database',
         'Topic :: Software Development :: Libraries :: Python Modules',
         ],
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-sql-1.2.0/sql/__init__.py 
new/python-sql-1.2.2/sql/__init__.py
--- old/python-sql-1.2.0/sql/__init__.py        2020-10-05 18:33:38.000000000 
+0200
+++ new/python-sql-1.2.2/sql/__init__.py        2021-05-16 12:15:18.000000000 
+0200
@@ -1,8 +1,8 @@
 # -*- coding: utf-8 -*-
 #
-# Copyright (c) 2011-2018, C??dric Krier
-# Copyright (c) 2013-2014, Nicolas ??vrard
-# Copyright (c) 2011-2018, B2CK
+# Copyright (c) 2011-2020, C??dric Krier
+# Copyright (c) 2013-2021, Nicolas ??vrard
+# Copyright (c) 2011-2021, B2CK
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -36,11 +36,15 @@
 from collections import defaultdict
 from itertools import chain
 
-__version__ = '1.2.0'
+__version__ = '1.2.2'
 __all__ = ['Flavor', 'Table', 'Values', 'Literal', 'Column', 'Join',
     'Asc', 'Desc', 'NullsFirst', 'NullsLast', 'format2numeric']
 
 
+def _escape_identifier(name):
+    return '"%s"' % name.replace('"', '""')
+
+
 def alias(i, letters=string.ascii_lowercase):
     '''
     Generate a unique alias based on integer
@@ -637,8 +641,8 @@
         p = []
         with AliasManager():
             # Set alias to window function to skip their params
-            for window_function in self.windows:
-                window_function.alias
+            for window in self.windows:
+                window.alias
 
             p.extend(self._with_params())
             for column in chain(self.distinct_on or (), self.columns):
@@ -657,8 +661,8 @@
                     p.extend(expression.params)
             if self.having:
                 p.extend(self.having.params)
-            for window_function in self.windows:
-                p.extend(window_function.window.params)
+            for window in self.windows:
+                p.extend(window.params)
         return tuple(p)
 
 
@@ -735,21 +739,19 @@
         if self.columns:
             assert all(col.table == self.table for col in self.columns)
             columns = ' (' + ', '.join(map(str, self.columns)) + ')'
-        if isinstance(self.values, Query):
-            values = ' %s' % str(self.values)
-            # TODO manage DEFAULT
-        elif self.values is None:
-            values = ' DEFAULT VALUES'
         with AliasManager():
-            table = self.table
-            AliasManager.set(table, str(table)[1:-1])
+            if isinstance(self.values, Query):
+                values = ' %s' % str(self.values)
+                # TODO manage DEFAULT
+            elif self.values is None:
+                values = ' DEFAULT VALUES'
             returning = ''
             if self.returning:
                 returning = ' RETURNING ' + ', '.join(
                     map(self._format, self.returning))
             return (self._with_str()
-                + 'INSERT INTO %s' % self.table + columns
-                + values + returning)
+                + 'INSERT INTO %s AS "%s"' % (self.table, self.table.alias)
+                + columns + values + returning)
 
     @property
     def params(self):
@@ -804,11 +806,7 @@
         with AliasManager():
             from_ = ''
             if self.from_:
-                table = From([self.table])
                 from_ = ' FROM %s' % str(self.from_)
-            else:
-                table = self.table
-                AliasManager.set(table, str(table)[1:-1])
             values = ', '.join('%s = %s' % (c, self._format(v))
                 for c, v in zip(columns, self.values))
             where = ''
@@ -819,8 +817,8 @@
                 returning = ' RETURNING ' + ', '.join(
                     map(self._format, self.returning))
             return (self._with_str()
-                + 'UPDATE %s SET ' % table + values + from_
-                + where + returning)
+                + 'UPDATE %s AS "%s" SET ' % (self.table, self.table.alias)
+                + values + from_ + where + returning)
 
     @property
     def params(self):
@@ -970,13 +968,8 @@
         self._database = database
 
     def __str__(self):
-        if self._database:
-            return '"%s"."%s"."%s"' % (
-                self._database, self._schema, self._name)
-        elif self._schema:
-            return '"%s"."%s"' % (self._schema, self._name)
-        else:
-            return '"%s"' % self._name
+        return '.'.join(map(_escape_identifier, filter(None,
+                    (self._database, self._schema, self._name))))
 
     @property
     def params(self):
@@ -1354,16 +1347,13 @@
         return self._name
 
     def __str__(self):
-        if self._name == '*':
-            t = '%s'
-        else:
-            t = '"%s"'
+        name = (self._name if self._name == '*'
+            else _escape_identifier(self._name))
         alias = self._from.alias
         if alias:
-            t = '"%s".' + t
-            return t % (alias, self._name)
+            return '%s.%s' % (_escape_identifier(alias), name)
         else:
-            return t % self._name
+            return name
 
     @property
     def params(self):
@@ -1379,7 +1369,7 @@
         self.output_name = output_name
 
     def __str__(self):
-        return '"%s"' % self.output_name
+        return '%s' % _escape_identifier(self.output_name)
 
     @property
     def params(self):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-sql-1.2.0/sql/tests/test_as.py 
new/python-sql-1.2.2/sql/tests/test_as.py
--- old/python-sql-1.2.0/sql/tests/test_as.py   2018-08-18 13:25:33.000000000 
+0200
+++ new/python-sql-1.2.2/sql/tests/test_as.py   2020-10-08 11:21:24.000000000 
+0200
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 #
-# Copyright (c) 2011-2013, C??dric Krier
-# Copyright (c) 2011-2013, B2CK
+# Copyright (c) 2011-2020, C??dric Krier
+# Copyright (c) 2011-2020, B2CK
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -41,13 +41,13 @@
     def test_as_select(self):
         query = self.table.select(self.column.as_('foo'))
         self.assertEqual(str(query), 'SELECT "a"."c" AS "foo" FROM "t" AS "a"')
-        self.assertEqual(query.params, ())
+        self.assertEqual(tuple(query.params), ())
 
     def test_no_as(self):
         query = self.table.select(self.column.as_('foo'))
         try:
             Flavor.set(Flavor(no_as=True))
             self.assertEqual(str(query), 'SELECT "a"."c" "foo" FROM "t" "a"')
-            self.assertEqual(query.params, ())
+            self.assertEqual(tuple(query.params), ())
         finally:
             Flavor.set(Flavor())
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-sql-1.2.0/sql/tests/test_column.py 
new/python-sql-1.2.2/sql/tests/test_column.py
--- old/python-sql-1.2.0/sql/tests/test_column.py       2018-08-18 
13:25:33.000000000 +0200
+++ new/python-sql-1.2.2/sql/tests/test_column.py       2021-05-16 
12:16:46.000000000 +0200
@@ -1,7 +1,8 @@
 # -*- coding: utf-8 -*-
 #
 # Copyright (c) 2011-2013, C??dric Krier
-# Copyright (c) 2011-2013, B2CK
+# Copyright (c) 2021, Nicolas ??vrard
+# Copyright (c) 2011-2021, B2CK
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -39,3 +40,11 @@
 
         with AliasManager():
             self.assertEqual(str(column), '"a"."c"')
+
+    def test_quote_in_column(self):
+        column = Column(Table('t'), 'b "c"')
+        self.assertEqual(str(column), '"b ""c"""')
+        self.assertEqual(column.name, 'b "c"')
+
+        with AliasManager():
+            self.assertEqual(str(column), '"a"."b ""c"""')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-sql-1.2.0/sql/tests/test_combining_query.py 
new/python-sql-1.2.2/sql/tests/test_combining_query.py
--- old/python-sql-1.2.0/sql/tests/test_combining_query.py      2018-08-18 
13:25:33.000000000 +0200
+++ new/python-sql-1.2.2/sql/tests/test_combining_query.py      2020-10-08 
11:21:39.000000000 +0200
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 #
-# Copyright (c) 2014, C??dric Krier
-# Copyright (c) 2014, B2CK
+# Copyright (c) 2014-2020, C??dric Krier
+# Copyright (c) 2014-2020, B2CK
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -40,34 +40,34 @@
         query = Union(self.q1, self.q2)
         self.assertEqual(str(query),
             'SELECT * FROM "t1" AS "a" UNION SELECT * FROM "t2" AS "b"')
-        self.assertEqual(query.params, ())
+        self.assertEqual(tuple(query.params), ())
 
         query = self.q1 | self.q2
         self.assertEqual(str(query),
             'SELECT * FROM "t1" AS "a" UNION SELECT * FROM "t2" AS "b"')
-        self.assertEqual(query.params, ())
+        self.assertEqual(tuple(query.params), ())
 
     def test_union3(self):
         query = Union(self.q1, self.q2, self.q3)
         self.assertEqual(str(query),
             'SELECT * FROM "t1" AS "a" UNION SELECT * FROM "t2" AS "b" '
             'UNION SELECT * FROM "t3" AS "c"')
-        self.assertEqual(query.params, ())
+        self.assertEqual(tuple(query.params), ())
 
         query = Union(Union(self.q1, self.q2), self.q3)
         self.assertEqual(str(query),
             'SELECT * FROM "t1" AS "a" UNION SELECT * FROM "t2" AS "b" '
             'UNION SELECT * FROM "t3" AS "c"')
-        self.assertEqual(query.params, ())
+        self.assertEqual(tuple(query.params), ())
 
         query = Union(self.q1, Union(self.q2, self.q3))
         self.assertEqual(str(query),
             'SELECT * FROM "t1" AS "a" UNION SELECT * FROM "t2" AS "b" '
             'UNION SELECT * FROM "t3" AS "c"')
-        self.assertEqual(query.params, ())
+        self.assertEqual(tuple(query.params), ())
 
         query = self.q1 | self.q2 | self.q3
         self.assertEqual(str(query),
             'SELECT * FROM "t1" AS "a" UNION SELECT * FROM "t2" AS "b" '
             'UNION SELECT * FROM "t3" AS "c"')
-        self.assertEqual(query.params, ())
+        self.assertEqual(tuple(query.params), ())
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-sql-1.2.0/sql/tests/test_insert.py 
new/python-sql-1.2.2/sql/tests/test_insert.py
--- old/python-sql-1.2.0/sql/tests/test_insert.py       2018-08-18 
13:25:33.000000000 +0200
+++ new/python-sql-1.2.2/sql/tests/test_insert.py       2021-05-16 
12:15:33.000000000 +0200
@@ -1,8 +1,8 @@
 # -*- coding: utf-8 -*-
 #
-# Copyright (c) 2011-2013, C??dric Krier
-# Copyright (c) 2013, Nicolas ??vrard
-# Copyright (c) 2011-2013, B2CK
+# Copyright (c) 2011-2020, C??dric Krier
+# Copyright (c) 2013-2021, Nicolas ??vrard
+# Copyright (c) 2011-2021, B2CK
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -38,22 +38,22 @@
 
     def test_insert_default(self):
         query = self.table.insert()
-        self.assertEqual(str(query), 'INSERT INTO "t" DEFAULT VALUES')
-        self.assertEqual(query.params, ())
+        self.assertEqual(str(query), 'INSERT INTO "t" AS "a" DEFAULT VALUES')
+        self.assertEqual(tuple(query.params), ())
 
     def test_insert_values(self):
         query = self.table.insert([self.table.c1, self.table.c2],
             [['foo', 'bar']])
         self.assertEqual(str(query),
-            'INSERT INTO "t" ("c1", "c2") VALUES (%s, %s)')
-        self.assertEqual(query.params, ('foo', 'bar'))
+            'INSERT INTO "t" AS "a" ("c1", "c2") VALUES (%s, %s)')
+        self.assertEqual(tuple(query.params), ('foo', 'bar'))
 
     def test_insert_many_values(self):
         query = self.table.insert([self.table.c1, self.table.c2],
             [['foo', 'bar'], ['spam', 'eggs']])
         self.assertEqual(str(query),
-            'INSERT INTO "t" ("c1", "c2") VALUES (%s, %s), (%s, %s)')
-        self.assertEqual(query.params, ('foo', 'bar', 'spam', 'eggs'))
+            'INSERT INTO "t" AS "a" ("c1", "c2") VALUES (%s, %s), (%s, %s)')
+        self.assertEqual(tuple(query.params), ('foo', 'bar', 'spam', 'eggs'))
 
     def test_insert_subselect(self):
         t1 = Table('t1')
@@ -61,23 +61,23 @@
         subquery = t2.select(t2.c1, t2.c2)
         query = t1.insert([t1.c1, t1.c2], subquery)
         self.assertEqual(str(query),
-            'INSERT INTO "t1" ("c1", "c2") '
+            'INSERT INTO "t1" AS "b" ("c1", "c2") '
             'SELECT "a"."c1", "a"."c2" FROM "t2" AS "a"')
-        self.assertEqual(query.params, ())
+        self.assertEqual(tuple(query.params), ())
 
     def test_insert_function(self):
         query = self.table.insert([self.table.c], [[Abs(-1)]])
         self.assertEqual(str(query),
-            'INSERT INTO "t" ("c") VALUES (ABS(%s))')
-        self.assertEqual(query.params, (-1,))
+            'INSERT INTO "t" AS "a" ("c") VALUES (ABS(%s))')
+        self.assertEqual(tuple(query.params), (-1,))
 
     def test_insert_returning(self):
         query = self.table.insert([self.table.c1, self.table.c2],
             [['foo', 'bar']], returning=[self.table.c1, self.table.c2])
         self.assertEqual(str(query),
-            'INSERT INTO "t" ("c1", "c2") VALUES (%s, %s) '
-            'RETURNING "t"."c1", "t"."c2"')
-        self.assertEqual(query.params, ('foo', 'bar'))
+            'INSERT INTO "t" AS "a" ("c1", "c2") VALUES (%s, %s) '
+            'RETURNING "a"."c1", "a"."c2"')
+        self.assertEqual(tuple(query.params), ('foo', 'bar'))
 
     def test_insert_returning_select(self):
         t1 = Table('t1')
@@ -86,10 +86,10 @@
             returning=[
                 t2.select(t2.c, where=(t2.c1 == t1.c) & (t2.c2 == 'bar'))])
         self.assertEqual(str(query),
-            'INSERT INTO "t1" ("c") VALUES (%s) '
-            'RETURNING (SELECT "b"."c" FROM "t2" AS "b" '
-            'WHERE (("b"."c1" = "t1"."c") AND ("b"."c2" = %s)))')
-        self.assertEqual(query.params, ('foo', 'bar'))
+            'INSERT INTO "t1" AS "b" ("c") VALUES (%s) '
+            'RETURNING (SELECT "a"."c" FROM "t2" AS "a" '
+            'WHERE (("a"."c1" = "b"."c") AND ("a"."c2" = %s)))')
+        self.assertEqual(tuple(query.params), ('foo', 'bar'))
 
     def test_with(self):
         t1 = Table('t1')
@@ -100,14 +100,14 @@
             with_=[w],
             values=w.select())
         self.assertEqual(str(query),
-            'WITH "b" AS (SELECT * FROM "t1" AS "c") '
-            'INSERT INTO "t" ("c1") SELECT * FROM "a" AS "a"')
-        self.assertEqual(query.params, ())
+            'WITH "a" AS (SELECT * FROM "t1" AS "b") '
+            'INSERT INTO "t" AS "c" ("c1") SELECT * FROM "a" AS "a"')
+        self.assertEqual(tuple(query.params), ())
 
     def test_schema(self):
         t1 = Table('t1', 'default')
         query = t1.insert([t1.c1], [['foo']])
 
         self.assertEqual(str(query),
-            'INSERT INTO "default"."t1" ("c1") VALUES (%s)')
-        self.assertEqual(query.params, ('foo',))
+            'INSERT INTO "default"."t1" AS "a" ("c1") VALUES (%s)')
+        self.assertEqual(tuple(query.params), ('foo',))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-sql-1.2.0/sql/tests/test_join.py 
new/python-sql-1.2.2/sql/tests/test_join.py
--- old/python-sql-1.2.0/sql/tests/test_join.py 2018-08-18 13:25:33.000000000 
+0200
+++ new/python-sql-1.2.2/sql/tests/test_join.py 2020-10-08 11:22:04.000000000 
+0200
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 #
-# Copyright (c) 2011-2013, C??dric Krier
-# Copyright (c) 2011-2013, B2CK
+# Copyright (c) 2011-2020, C??dric Krier
+# Copyright (c) 2011-2020, B2CK
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -39,7 +39,7 @@
         join = Join(t1, t2)
         with AliasManager():
             self.assertEqual(str(join), '"t1" AS "a" INNER JOIN "t2" AS "b"')
-            self.assertEqual(join.params, ())
+            self.assertEqual(tuple(join.params), ())
 
         join.condition = t1.c == t2.c
         with AliasManager():
@@ -56,11 +56,11 @@
             self.assertEqual(str(join),
                 '"t1" AS "a" INNER JOIN (SELECT * FROM "t2" AS "c") AS "b" '
                 'ON ("a"."c" = "b"."c")')
-            self.assertEqual(join.params, ())
+            self.assertEqual(tuple(join.params), ())
 
     def test_join_function(self):
         t1 = Table('t1')
         join = Join(t1, Now())
         with AliasManager():
             self.assertEqual(str(join), '"t1" AS "a" INNER JOIN NOW() AS "b"')
-            self.assertEqual(join.params, ())
+            self.assertEqual(tuple(join.params), ())
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-sql-1.2.0/sql/tests/test_lateral.py 
new/python-sql-1.2.2/sql/tests/test_lateral.py
--- old/python-sql-1.2.0/sql/tests/test_lateral.py      2018-08-18 
13:25:33.000000000 +0200
+++ new/python-sql-1.2.2/sql/tests/test_lateral.py      2020-10-08 
11:22:16.000000000 +0200
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 #
-# Copyright (c) 2015, C??dric Krier
-# Copyright (c) 2015, B2CK
+# Copyright (c) 2015-2020, C??dric Krier
+# Copyright (c) 2015-2020, B2CK
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -43,7 +43,7 @@
         self.assertEqual(str(query),
             'SELECT * FROM "t1" AS "a", LATERAL '
             '(SELECT * FROM "t2" AS "c" WHERE ("c"."id" = "a"."t2")) AS "b"')
-        self.assertEqual(query.params, ())
+        self.assertEqual(tuple(query.params), ())
 
     def test_lateral_function(self):
 
@@ -56,4 +56,4 @@
 
         self.assertEqual(str(query),
             'SELECT * FROM "t" AS "a", LATERAL FUNC("a"."a") AS "b"')
-        self.assertEqual(query.params, ())
+        self.assertEqual(tuple(query.params), ())
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-sql-1.2.0/sql/tests/test_select.py 
new/python-sql-1.2.2/sql/tests/test_select.py
--- old/python-sql-1.2.0/sql/tests/test_select.py       2020-09-29 
12:59:59.000000000 +0200
+++ new/python-sql-1.2.2/sql/tests/test_select.py       2020-10-08 
11:22:26.000000000 +0200
@@ -1,8 +1,8 @@
 # -*- coding: utf-8 -*-
 #
-# Copyright (c) 2011-2016, C??dric Krier
+# Copyright (c) 2011-2020, C??dric Krier
 # Copyright (c) 2013-2014, Nicolas ??vrard
-# Copyright (c) 2011-2016, B2CK
+# Copyright (c) 2011-2020, B2CK
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -42,12 +42,12 @@
     def test_select1(self):
         query = self.table.select()
         self.assertEqual(str(query), 'SELECT * FROM "t" AS "a"')
-        self.assertEqual(query.params, ())
+        self.assertEqual(tuple(query.params), ())
 
     def test_select2(self):
         query = self.table.select(self.table.c)
         self.assertEqual(str(query), 'SELECT "a"."c" FROM "t" AS "a"')
-        self.assertEqual(query.params, ())
+        self.assertEqual(tuple(query.params), ())
 
         query.columns += (self.table.c2,)
         self.assertEqual(str(query),
@@ -57,41 +57,41 @@
         query = self.table.select(where=(self.table.c == 'foo'))
         self.assertEqual(str(query),
             'SELECT * FROM "t" AS "a" WHERE ("a"."c" = %s)')
-        self.assertEqual(query.params, ('foo',))
+        self.assertEqual(tuple(query.params), ('foo',))
 
     def test_select_without_from(self):
         query = Select([Literal(1)])
         self.assertEqual(str(query), 'SELECT %s')
-        self.assertEqual(query.params, (1,))
+        self.assertEqual(tuple(query.params), (1,))
 
     def test_select_select(self):
         query = Select([Select([Literal(1)])])
         self.assertEqual(str(query), 'SELECT (SELECT %s)')
-        self.assertEqual(query.params, (1,))
+        self.assertEqual(tuple(query.params), (1,))
 
     def test_select_select_as(self):
         query = Select([Select([Literal(1)]).as_('foo')])
         self.assertEqual(str(query), 'SELECT (SELECT %s) AS "foo"')
-        self.assertEqual(query.params, (1,))
+        self.assertEqual(tuple(query.params), (1,))
 
     def test_select_distinct(self):
         query = self.table.select(self.table.c, distinct=True)
         self.assertEqual(
             str(query), 'SELECT DISTINCT "a"."c" FROM "t" AS "a"')
-        self.assertEqual(query.params, ())
+        self.assertEqual(tuple(query.params), ())
 
     def test_select_distinct_on(self):
         query = self.table.select(self.table.c, distinct_on=self.table.c)
         self.assertEqual(
             str(query), 'SELECT DISTINCT ON ("a"."c") "a"."c" FROM "t" AS "a"')
-        self.assertEqual(query.params, ())
+        self.assertEqual(tuple(query.params), ())
 
         query = self.table.select(
             self.table.c, distinct_on=[self.table.a, self.table.b])
         self.assertEqual(
             str(query),
             'SELECT DISTINCT ON ("a"."a", "a"."b") "a"."c" FROM "t" AS "a"')
-        self.assertEqual(query.params, ())
+        self.assertEqual(tuple(query.params), ())
 
     def test_select_from_list(self):
         t2 = Table('t2')
@@ -99,7 +99,7 @@
         query = (self.table + t2 + t3).select(self.table.c, getattr(t2, '*'))
         self.assertEqual(str(query),
             'SELECT "a"."c", "b".* FROM "t" AS "a", "t2" AS "b", "t3" AS "c"')
-        self.assertEqual(query.params, ())
+        self.assertEqual(tuple(query.params), ())
 
     def test_select_union(self):
         query1 = self.table.select()
@@ -119,11 +119,11 @@
         self.assertEqual(str(union),
             'SELECT * FROM "t" AS "a" WHERE ("a"."c" = %s) UNION ALL '
             'SELECT * FROM "t2" AS "b"')
-        self.assertEqual(union.params, ('foo',))
+        self.assertEqual(tuple(union.params), ('foo',))
 
         union = Union(query1)
         self.assertEqual(str(union), str(query1))
-        self.assertEqual(union.params, query1.params)
+        self.assertEqual(tuple(union.params), tuple(query1.params))
 
     def test_select_union_order(self):
         query1 = self.table.select()
@@ -134,7 +134,7 @@
             'SELECT * FROM "t" AS "a" UNION '
             'SELECT * FROM "t2" AS "b" '
             'ORDER BY %s')
-        self.assertEqual(union.params, (1,))
+        self.assertEqual(tuple(union.params), (1,))
 
     def test_select_intersect(self):
         query1 = self.table.select()
@@ -176,12 +176,12 @@
         select = t1.select()
         self.assertEqual(str(select.select()),
             'SELECT * FROM (SELECT * FROM "t1" AS "b") AS "a"')
-        self.assertEqual(select.params, ())
+        self.assertEqual(tuple(select.params), ())
 
     def test_select_function(self):
         query = Now().select()
         self.assertEqual(str(query), 'SELECT * FROM NOW() AS "a"')
-        self.assertEqual(query.params, ())
+        self.assertEqual(tuple(query.params), ())
 
     def test_select_function_columns_definitions(self):
         class Crosstab(Function):
@@ -192,25 +192,25 @@
                 ('c1', 'INT'), ('c2', 'CHAR'), ('c3', 'BOOL')]).select()
         self.assertEqual(str(query), 'SELECT * FROM CROSSTAB(%s, %s) '
             'AS "a" ("c1" INT, "c2" CHAR, "c3" BOOL)')
-        self.assertEqual(query.params, ('query1', 'query2'))
+        self.assertEqual(tuple(query.params), ('query1', 'query2'))
 
     def test_select_group_by(self):
         column = self.table.c
         query = self.table.select(column, group_by=column)
         self.assertEqual(str(query),
             'SELECT "a"."c" FROM "t" AS "a" GROUP BY "a"."c"')
-        self.assertEqual(query.params, ())
+        self.assertEqual(tuple(query.params), ())
 
         output = column.as_('c1')
         query = self.table.select(output, group_by=output)
         self.assertEqual(str(query),
             'SELECT "a"."c" AS "c1" FROM "t" AS "a" GROUP BY "c1"')
-        self.assertEqual(query.params, ())
+        self.assertEqual(tuple(query.params), ())
 
         query = self.table.select(Literal('foo'), group_by=Literal('foo'))
         self.assertEqual(str(query),
             'SELECT %s FROM "t" AS "a" GROUP BY %s')
-        self.assertEqual(query.params, ('foo', 'foo'))
+        self.assertEqual(tuple(query.params), ('foo', 'foo'))
 
     def test_select_having(self):
         col1 = self.table.col1
@@ -220,14 +220,14 @@
         self.assertEqual(str(query),
             'SELECT "a"."col1", MIN("a"."col2") FROM "t" AS "a" '
             'HAVING (MIN("a"."col2") > %s)')
-        self.assertEqual(query.params, (3,))
+        self.assertEqual(tuple(query.params), (3,))
 
     def test_select_order(self):
         c = self.table.c
         query = self.table.select(c, order_by=Literal(1))
         self.assertEqual(str(query),
             'SELECT "a"."c" FROM "t" AS "a" ORDER BY %s')
-        self.assertEqual(query.params, (1,))
+        self.assertEqual(tuple(query.params), (1,))
 
     def test_select_limit_offset(self):
         try:
@@ -235,34 +235,34 @@
             query = self.table.select(limit=50, offset=10)
             self.assertEqual(str(query),
                 'SELECT * FROM "t" AS "a" LIMIT 50 OFFSET 10')
-            self.assertEqual(query.params, ())
+            self.assertEqual(tuple(query.params), ())
 
             query.limit = None
             self.assertEqual(str(query),
                 'SELECT * FROM "t" AS "a" OFFSET 10')
-            self.assertEqual(query.params, ())
+            self.assertEqual(tuple(query.params), ())
 
             query.offset = 0
             self.assertEqual(str(query),
                 'SELECT * FROM "t" AS "a"')
-            self.assertEqual(query.params, ())
+            self.assertEqual(tuple(query.params), ())
 
             Flavor.set(Flavor(limitstyle='limit', max_limit=-1))
 
             query.offset = None
             self.assertEqual(str(query),
                 'SELECT * FROM "t" AS "a"')
-            self.assertEqual(query.params, ())
+            self.assertEqual(tuple(query.params), ())
 
             query.offset = 0
             self.assertEqual(str(query),
                 'SELECT * FROM "t" AS "a"')
-            self.assertEqual(query.params, ())
+            self.assertEqual(tuple(query.params), ())
 
             query.offset = 10
             self.assertEqual(str(query),
                 'SELECT * FROM "t" AS "a" LIMIT -1 OFFSET 10')
-            self.assertEqual(query.params, ())
+            self.assertEqual(tuple(query.params), ())
         finally:
             Flavor.set(Flavor())
 
@@ -273,17 +273,17 @@
             self.assertEqual(str(query),
                 'SELECT * FROM "t" AS "a" '
                 'OFFSET (10) ROWS FETCH FIRST (50) ROWS ONLY')
-            self.assertEqual(query.params, ())
+            self.assertEqual(tuple(query.params), ())
 
             query.limit = None
             self.assertEqual(str(query),
                 'SELECT * FROM "t" AS "a" OFFSET (10) ROWS')
-            self.assertEqual(query.params, ())
+            self.assertEqual(tuple(query.params), ())
 
             query.offset = 0
             self.assertEqual(str(query),
                 'SELECT * FROM "t" AS "a"')
-            self.assertEqual(query.params, ())
+            self.assertEqual(tuple(query.params), ())
         finally:
             Flavor.set(Flavor())
 
@@ -297,7 +297,7 @@
                         'SELECT * FROM "t" AS "c") AS "b" '
                     'WHERE (ROWNUM <= %s)) AS "a" '
                 'WHERE ("rnum" > %s)')
-            self.assertEqual(query.params, (60, 10))
+            self.assertEqual(tuple(query.params), (60, 10))
 
             query = self.table.select(
                 self.table.c1.as_('col1'), self.table.c2.as_('col2'),
@@ -309,7 +309,7 @@
                         'FROM "t" AS "c") AS "b" '
                     'WHERE (ROWNUM <= %s)) AS "a" '
                 'WHERE ("rnum" > %s)')
-            self.assertEqual(query.params, (60, 10))
+            self.assertEqual(tuple(query.params), (60, 10))
 
             subquery = query.select(query.col1, query.col2)
             self.assertEqual(str(subquery),
@@ -323,7 +323,7 @@
                     'WHERE ("rnum" > %s)) AS "a"')
             # XXX alias of query is reused but not a problem
             # as it is hidden in subquery
-            self.assertEqual(query.params, (60, 10))
+            self.assertEqual(tuple(query.params), (60, 10))
 
             query = self.table.select(limit=50, offset=10,
                 order_by=[self.table.c])
@@ -333,14 +333,14 @@
                         'SELECT * FROM "t" AS "c" ORDER BY "c"."c") AS "b" '
                     'WHERE (ROWNUM <= %s)) AS "a" '
                 'WHERE ("rnum" > %s)')
-            self.assertEqual(query.params, (60, 10))
+            self.assertEqual(tuple(query.params), (60, 10))
 
             query = self.table.select(limit=50)
             self.assertEqual(str(query),
                 'SELECT "a".* FROM ('
                     'SELECT * FROM "t" AS "b") AS "a" '
                 'WHERE (ROWNUM <= %s)')
-            self.assertEqual(query.params, (50,))
+            self.assertEqual(tuple(query.params), (50,))
 
             query = self.table.select(offset=10)
             self.assertEqual(str(query),
@@ -348,7 +348,7 @@
                     'SELECT "b".*, ROWNUM AS "rnum" FROM ('
                         'SELECT * FROM "t" AS "c") AS "b") AS "a" '
                 'WHERE ("rnum" > %s)')
-            self.assertEqual(query.params, (10,))
+            self.assertEqual(tuple(query.params), (10,))
 
             query = self.table.select(self.table.c.as_('col'),
                 where=self.table.c >= 20,
@@ -360,7 +360,7 @@
                         'WHERE ("c"."c" >= %s)) AS "b" '
                     'WHERE (ROWNUM <= %s)) AS "a" '
                 'WHERE ("rnum" > %s)')
-            self.assertEqual(query.params, (20, 60, 10))
+            self.assertEqual(tuple(query.params), (20, 60, 10))
         finally:
             Flavor.set(Flavor())
 
@@ -369,14 +369,14 @@
         query = self.table.select(c, for_=For('UPDATE'))
         self.assertEqual(str(query),
             'SELECT "a"."c" FROM "t" AS "a" FOR UPDATE')
-        self.assertEqual(query.params, ())
+        self.assertEqual(tuple(query.params), ())
 
     def test_copy(self):
         query = self.table.select()
         copy_query = deepcopy(query)
         self.assertNotEqual(query, copy_query)
         self.assertEqual(str(copy_query), 'SELECT * FROM "t" AS "a"')
-        self.assertEqual(copy_query.params, ())
+        self.assertEqual(tuple(copy_query.params), ())
 
     def test_with(self):
         w = With(query=self.table.select(self.table.c1))
@@ -385,7 +385,7 @@
         self.assertEqual(str(query),
             'WITH "a" AS (SELECT "b"."c1" FROM "t" AS "b") '
             'SELECT * FROM "a" AS "a"')
-        self.assertEqual(query.params, ())
+        self.assertEqual(tuple(query.params), ())
 
     def test_window(self):
         query = self.table.select(Min(self.table.c1,
@@ -394,13 +394,13 @@
         self.assertEqual(str(query),
             'SELECT MIN("a"."c1") OVER "b" FROM "t" AS "a" '
             'WINDOW "b" AS (PARTITION BY "a"."c2")')
-        self.assertEqual(query.params, ())
+        self.assertEqual(tuple(query.params), ())
 
         query = self.table.select(Rank(window=Window([])))
         self.assertEqual(str(query),
             'SELECT RANK() OVER "b" FROM "t" AS "a" '
             'WINDOW "b" AS ()')
-        self.assertEqual(query.params, ())
+        self.assertEqual(tuple(query.params), ())
 
         window = Window([self.table.c1])
         query = self.table.select(
@@ -410,7 +410,7 @@
             'SELECT RANK() FILTER (WHERE ("a"."c1" > %s)) OVER "b", '
             'MIN("a"."c1") OVER "b" FROM "t" AS "a" '
             'WINDOW "b" AS (PARTITION BY "a"."c1")')
-        self.assertEqual(query.params, (0,))
+        self.assertEqual(tuple(query.params), (0,))
 
         window = Window([DatePart('year', self.table.date_col)])
         query = self.table.select(
@@ -418,7 +418,7 @@
         self.assertEqual(str(query),
             'SELECT MIN("a"."c1") OVER "b" FROM "t" AS "a" '
             'WINDOW "b" AS (PARTITION BY DATE_PART(%s, "a"."date_col"))')
-        self.assertEqual(query.params, ('year',))
+        self.assertEqual(tuple(query.params), ('year',))
 
         window = Window([self.table.c2])
         query = self.table.select(
@@ -428,7 +428,7 @@
             'SELECT (MAX("a"."c1") OVER (PARTITION BY "a"."c2") '
             '/ MIN("a"."c1") OVER (PARTITION BY "a"."c2")) '
             'FROM "t" AS "a"')
-        self.assertEqual(query.params, ())
+        self.assertEqual(tuple(query.params), ())
 
         window = Window([Literal(1)])
         query = self.table.select(
@@ -438,7 +438,7 @@
             'SELECT (MAX("a"."c1") OVER (PARTITION BY %s) '
             '/ MIN("a"."c1") OVER (PARTITION BY %s)) '
             'FROM "t" AS "a"')
-        self.assertEqual(query.params, (1, 1))
+        self.assertEqual(tuple(query.params), (1, 1))
 
         window1 = Window([self.table.c2])
         window2 = Window([Literal(1)])
@@ -451,7 +451,7 @@
             '/ MIN("a"."c1") OVER (PARTITION BY %s)) '
             'FROM "t" AS "a" '
             'WINDOW "b" AS (PARTITION BY "a"."c2")')
-        self.assertEqual(query.params, (1,))
+        self.assertEqual(tuple(query.params), (1,))
 
     def test_order_params(self):
         with_ = With(query=self.table.select(self.table.c,
@@ -464,13 +464,13 @@
             group_by=[Literal(5)],
             order_by=[Literal(6)],
             having=Literal(7))
-        self.assertEqual(query.params, (1, 2, 3, 4, 5, 6, 7, 8))
+        self.assertEqual(tuple(query.params), (1, 2, 3, 4, 5, 6, 7, 8))
 
     def test_no_as(self):
         query = self.table.select(self.table.c)
         try:
             Flavor.set(Flavor(no_as=True))
             self.assertEqual(str(query), 'SELECT "a"."c" FROM "t" "a"')
-            self.assertEqual(query.params, ())
+            self.assertEqual(tuple(query.params), ())
         finally:
             Flavor.set(Flavor())
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-sql-1.2.0/sql/tests/test_table.py 
new/python-sql-1.2.2/sql/tests/test_table.py
--- old/python-sql-1.2.0/sql/tests/test_table.py        2018-08-18 
13:25:33.000000000 +0200
+++ new/python-sql-1.2.2/sql/tests/test_table.py        2021-05-16 
12:17:10.000000000 +0200
@@ -1,7 +1,8 @@
 # -*- coding: utf-8 -*-
 #
 # Copyright (c) 2015, C??dric Krier
-# Copyright (c) 2015, B2CK
+# Copyright (c) 2021, Nicolas ??vrard
+# Copyright (c) 2015-2021, B2CK
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -38,6 +39,10 @@
         t = Table('mytable')
         self.assertEqual(str(t), '"mytable"')
 
+    def test_quoted_name(self):
+        t = Table('my "quoted" name')
+        self.assertEqual(str(t), '"my ""quoted"" name"')
+
     def test_schema(self):
         t = Table('mytable', schema='myschema')
         self.assertEqual(str(t), '"myschema"."mytable"')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-sql-1.2.0/sql/tests/test_update.py 
new/python-sql-1.2.2/sql/tests/test_update.py
--- old/python-sql-1.2.0/sql/tests/test_update.py       2018-08-18 
13:25:33.000000000 +0200
+++ new/python-sql-1.2.2/sql/tests/test_update.py       2021-05-16 
12:16:03.000000000 +0200
@@ -1,7 +1,8 @@
 # -*- coding: utf-8 -*-
 #
 # Copyright (c) 2011-2013, C??dric Krier
-# Copyright (c) 2011-2013, B2CK
+# Copyright (c) 2021, Nicolas ??vrard
+# Copyright (c) 2011-2021, B2CK
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -36,12 +37,12 @@
 
     def test_update1(self):
         query = self.table.update([self.table.c], ['foo'])
-        self.assertEqual(str(query), 'UPDATE "t" SET "c" = %s')
+        self.assertEqual(str(query), 'UPDATE "t" AS "a" SET "c" = %s')
         self.assertEqual(query.params, ('foo',))
 
         query.where = (self.table.b == Literal(True))
         self.assertEqual(str(query),
-            'UPDATE "t" SET "c" = %s WHERE ("t"."b" = %s)')
+            'UPDATE "t" AS "a" SET "c" = %s WHERE ("a"."b" = %s)')
         self.assertEqual(query.params, ('foo', True))
 
     def test_update2(self):
@@ -60,15 +61,15 @@
         query_nolist = t1.update([t1.c], t2.select(t2.c, where=t2.i == t1.i))
         for query in [query_list, query_nolist]:
             self.assertEqual(str(query),
-                'UPDATE "t1" SET "c" = ('
-                'SELECT "b"."c" FROM "t2" AS "b" WHERE ("b"."i" = "t1"."i"))')
+                'UPDATE "t1" AS "b" SET "c" = ('
+                'SELECT "a"."c" FROM "t2" AS "a" WHERE ("a"."i" = "b"."i"))')
             self.assertEqual(query.params, ())
 
     def test_update_returning(self):
         query = self.table.update([self.table.c], ['foo'],
             returning=[self.table.c])
         self.assertEqual(str(query),
-            'UPDATE "t" SET "c" = %s RETURNING "t"."c"')
+            'UPDATE "t" AS "a" SET "c" = %s RETURNING "a"."c"')
         self.assertEqual(query.params, ('foo',))
 
     def test_update_returning_select(self):
@@ -78,9 +79,9 @@
             returning=[
                 t2.select(t2.c, where=(t2.c1 == t1.c) & (t2.c2 == 'bar'))])
         self.assertEqual(str(query),
-            'UPDATE "t1" SET "c" = %s '
-            'RETURNING (SELECT "b"."c" FROM "t2" AS "b" '
-            'WHERE (("b"."c1" = "t1"."c") AND ("b"."c2" = %s)))')
+            'UPDATE "t1" AS "b" SET "c" = %s '
+            'RETURNING (SELECT "a"."c" FROM "t2" AS "a" '
+            'WHERE (("a"."c1" = "b"."c") AND ("a"."c2" = %s)))')
         self.assertEqual(query.params, ('foo', 'bar'))
 
     def test_with(self):
@@ -92,16 +93,17 @@
             with_=[w],
             values=[w.select(w.c3, where=w.c4 == 2)])
         self.assertEqual(str(query),
-            'WITH "b" AS (SELECT "c"."c1" FROM "t1" AS "c") '
-            'UPDATE "t" SET "c2" = (SELECT "b"."c3" FROM "b" AS "b" '
-            'WHERE ("b"."c4" = %s))')
+            'WITH "a" AS (SELECT "b"."c1" FROM "t1" AS "b") '
+            'UPDATE "t" AS "c" SET "c2" = (SELECT "a"."c3" FROM "a" AS "a" '
+            'WHERE ("a"."c4" = %s))')
         self.assertEqual(query.params, (2,))
 
     def test_schema(self):
         t1 = Table('t1', 'default')
         query = t1.update([t1.c1], ['foo'])
 
-        self.assertEqual(str(query), 'UPDATE "default"."t1" SET "c1" = %s')
+        self.assertEqual(
+            str(query), 'UPDATE "default"."t1" AS "a" SET "c1" = %s')
         self.assertEqual(query.params, ('foo',))
 
     def test_schema_subselect(self):
@@ -110,7 +112,7 @@
         query = t1.update([t1.c1], t2.select(t2.c, where=t2.i == t1.i))
 
         self.assertEqual(str(query),
-            'UPDATE "default"."t1" SET "c1" = ('
-            'SELECT "b"."c" FROM "default"."t2" AS "b" '
-            'WHERE ("b"."i" = "default"."t1"."i"))')
+            'UPDATE "default"."t1" AS "b" SET "c1" = ('
+            'SELECT "a"."c" FROM "default"."t2" AS "a" '
+            'WHERE ("a"."i" = "b"."i"))')
         self.assertEqual(query.params, ())
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-sql-1.2.0/sql/tests/test_values.py 
new/python-sql-1.2.2/sql/tests/test_values.py
--- old/python-sql-1.2.0/sql/tests/test_values.py       2018-08-18 
13:25:33.000000000 +0200
+++ new/python-sql-1.2.2/sql/tests/test_values.py       2020-10-08 
11:22:36.000000000 +0200
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 #
-# Copyright (c) 2014, C??dric Krier
-# Copyright (c) 2014, B2CK
+# Copyright (c) 2014-2020, C??dric Krier
+# Copyright (c) 2014-2020, B2CK
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -47,7 +47,7 @@
         query = values.select()
         self.assertEqual(str(query),
             'SELECT * FROM (VALUES (%s), (%s), (%s)) AS "a"')
-        self.assertEqual(query.params, (1, 2, 3))
+        self.assertEqual(tuple(query.params), (1, 2, 3))
 
     def test_union(self):
         values = Values([[1]])
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-sql-1.2.0/sql/tests/test_with.py 
new/python-sql-1.2.2/sql/tests/test_with.py
--- old/python-sql-1.2.0/sql/tests/test_with.py 2018-08-18 13:25:33.000000000 
+0200
+++ new/python-sql-1.2.2/sql/tests/test_with.py 2020-10-08 11:23:02.000000000 
+0200
@@ -1,7 +1,8 @@
 # -*- coding: utf-8 -*-
 #
 # Copyright (c) 2014, Nicolas ??vrard
-# Copyright (c) 2014, B2CK
+# Copyright (c) 2014-2020, B2CK
+# Copyright (c) 2020, C??dric Krier
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -87,4 +88,4 @@
             'UNION ALL '
             'SELECT ("a"."n" + %s) FROM "a" AS "a" WHERE ("a"."n" < %s)'
             ') SELECT * FROM "a" AS "a"')
-        self.assertEqual(q.params, (1, 1, 100))
+        self.assertEqual(tuple(q.params), (1, 1, 100))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-sql-1.2.0/tox.ini new/python-sql-1.2.2/tox.ini
--- old/python-sql-1.2.0/tox.ini        2019-12-26 10:47:34.000000000 +0100
+++ new/python-sql-1.2.2/tox.ini        2021-05-09 09:36:27.000000000 +0200
@@ -4,7 +4,7 @@
 # and then run "tox" from this directory.
 
 [tox]
-envlist = py26, py27, py33, py34, py35, py36, py37, py38, pypy, pypy3, jython
+envlist = py26, py27, py33, py34, py35, py36, py37, py38, py39, pypy, pypy3, 
jython
 
 [testenv]
 commands = {envpython} setup.py test

Reply via email to