diff -pruN 1.5.2-2/.gitlab-ci.yml 1.6.0-1/.gitlab-ci.yml
--- 1.5.2-2/.gitlab-ci.yml	2024-09-30 20:40:59.000000000 +0000
+++ 1.6.0-1/.gitlab-ci.yml	2025-05-01 12:27:06.000000000 +0000
@@ -57,7 +57,7 @@ test-tox-python:
     - tox -e "py${PYTHON_VERSION/./}" -- -v --output-file junit.xml
   parallel:
     matrix:
-      - PYTHON_VERSION: ["3.5", "3.6", "3.7", "3.8", "3.9", "3.10", "3.11", "3.12"]
+      - PYTHON_VERSION: ["3.5", "3.6", "3.7", "3.8", "3.9", "3.10", "3.11", "3.12", "3.13"]
 
 test-tox-pypy:
   extends: .test-tox
diff -pruN 1.5.2-2/.hgtags 1.6.0-1/.hgtags
--- 1.5.2-2/.hgtags	2024-09-30 20:43:40.000000000 +0000
+++ 1.6.0-1/.hgtags	2025-05-02 19:54:17.000000000 +0000
@@ -20,3 +20,4 @@ fcb64787b51db2068061eb4aa13825abc1134916
 6f9066b83fe3a8c4699a8555ad1bc406f18974ff 1.5.0
 79a69b0bbbd35a8d95e1b754ed3feb03df23fb70 1.5.1
 41b0aaa68f5e5bab3889fa1ef57ef44c6c21cacf 1.5.2
+475502ba46eba3b7e141e8fbceaf495b545bcddb 1.6.0
diff -pruN 1.5.2-2/CHANGELOG 1.6.0-1/CHANGELOG
--- 1.5.2-2/CHANGELOG	2024-09-30 20:41:55.000000000 +0000
+++ 1.6.0-1/CHANGELOG	2025-05-02 19:52:18.000000000 +0000
@@ -1,3 +1,8 @@
+Version 1.6.0 - 2025-05-02
+* Fix position of order_by parameters in Select query
+* Add support for weak reference on SQL objects
+* Add support for Python 3.13
+
 Version 1.5.2 - 2024-09-30
 * Use parameter for unary operator
 * Support default values when inserting not matched merge
diff -pruN 1.5.2-2/COPYRIGHT 1.6.0-1/COPYRIGHT
--- 1.5.2-2/COPYRIGHT	2024-09-30 20:43:01.000000000 +0000
+++ 1.6.0-1/COPYRIGHT	2025-05-02 19:52:34.000000000 +0000
@@ -1,6 +1,6 @@
-Copyright (c) 2011-2024, Cédric Krier
-Copyright (c) 2013-2023, Nicolas Évrard
-Copyright (c) 2011-2024, B2CK
+Copyright (c) 2011-2025, Cédric Krier
+Copyright (c) 2013-2025, Nicolas Évrard
+Copyright (c) 2011-2025, B2CK
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
diff -pruN 1.5.2-2/PKG-INFO 1.6.0-1/PKG-INFO
--- 1.5.2-2/PKG-INFO	2024-09-30 20:43:58.992733700 +0000
+++ 1.6.0-1/PKG-INFO	2025-05-02 19:54:47.894437800 +0000
@@ -1,6 +1,6 @@
-Metadata-Version: 2.1
+Metadata-Version: 2.4
 Name: python-sql
-Version: 1.5.2
+Version: 1.6.0
 Summary: Library to write SQL queries
 Home-page: https://pypi.org/project/python-sql/
 Download-URL: https://downloads.tryton.org/python-sql/
@@ -24,9 +24,21 @@ Classifier: Programming Language :: Pyth
 Classifier: Programming Language :: Python :: 3.10
 Classifier: Programming Language :: Python :: 3.11
 Classifier: Programming Language :: Python :: 3.12
+Classifier: Programming Language :: Python :: 3.13
 Classifier: Topic :: Database
 Classifier: Topic :: Software Development :: Libraries :: Python Modules
 Requires-Python: >=3.5
+Dynamic: author
+Dynamic: author-email
+Dynamic: classifier
+Dynamic: description
+Dynamic: download-url
+Dynamic: home-page
+Dynamic: keywords
+Dynamic: license
+Dynamic: project-url
+Dynamic: requires-python
+Dynamic: summary
 
 python-sql
 ==========
@@ -136,23 +148,23 @@ Select on other schema::
 Insert query with default values::
 
     >>> tuple(user.insert())
-    ('INSERT INTO "user" AS "a" DEFAULT VALUES', ())
+    ('INSERT INTO "user" DEFAULT VALUES', ())
 
 Insert query with values::
 
     >>> tuple(user.insert(columns=[user.name, user.login],
     ...         values=[['Foo', 'foo']]))
-    ('INSERT INTO "user" AS "a" ("name", "login") VALUES (%s, %s)', ('Foo', 'foo'))
+    ('INSERT INTO "user" ("name", "login") VALUES (%s, %s)', ('Foo', 'foo'))
     >>> tuple(user.insert(columns=[user.name, user.login],
     ...         values=[['Foo', 'foo'], ['Bar', 'bar']]))
-    ('INSERT INTO "user" AS "a" ("name", "login") VALUES (%s, %s), (%s, %s)', ('Foo', 'foo', 'Bar', 'bar'))
+    ('INSERT INTO "user" ("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" AS "b" SELECT "a"."login", "a"."passwd" FROM "passwd" AS "a"', ())
+    ('INSERT INTO "user" SELECT "a"."login", "a"."passwd" FROM "passwd" AS "a"', ())
 
 Update query with values::
 
@@ -196,23 +208,23 @@ Flavors::
     >>> select.offset = 10
     >>> Flavor.set(Flavor())
     >>> tuple(select)
-    ('SELECT * FROM "user" AS "a" OFFSET 10', ())
+    ('SELECT * FROM "user" AS "a" OFFSET %s', (10,))
     >>> Flavor.set(Flavor(max_limit=18446744073709551615))
     >>> tuple(select)
-    ('SELECT * FROM "user" AS "a" LIMIT 18446744073709551615 OFFSET 10', ())
+    ('SELECT * FROM "user" AS "a" LIMIT 18446744073709551615 OFFSET %s', (10,))
     >>> Flavor.set(Flavor(max_limit=-1))
     >>> tuple(select)
-    ('SELECT * FROM "user" AS "a" LIMIT -1 OFFSET 10', ())
+    ('SELECT * FROM "user" AS "a" LIMIT -1 OFFSET %s', (10,))
 
 Limit style::
 
     >>> select = user.select(limit=10, offset=20)
     >>> Flavor.set(Flavor(limitstyle='limit'))
     >>> tuple(select)
-    ('SELECT * FROM "user" AS "a" LIMIT 10 OFFSET 20', ())
+    ('SELECT * FROM "user" AS "a" LIMIT %s OFFSET %s', (10, 20))
     >>> Flavor.set(Flavor(limitstyle='fetch'))
     >>> tuple(select)
-    ('SELECT * FROM "user" AS "a" OFFSET (20) ROWS FETCH FIRST (10) ROWS ONLY', ())
+    ('SELECT * FROM "user" AS "a" OFFSET (%s) ROWS FETCH FIRST (%s) ROWS ONLY', (20, 10))
     >>> Flavor.set(Flavor(limitstyle='rownum'))
     >>> tuple(select)
     ('SELECT "a".* FROM (SELECT "b".*, ROWNUM AS "rnum" FROM (SELECT * FROM "user" AS "c") AS "b" WHERE (ROWNUM <= %s)) AS "a" WHERE ("rnum" > %s)', (30, 20))
diff -pruN 1.5.2-2/README.rst 1.6.0-1/README.rst
--- 1.5.2-2/README.rst	2021-09-10 11:50:13.000000000 +0000
+++ 1.6.0-1/README.rst	2025-05-01 12:27:06.000000000 +0000
@@ -106,23 +106,23 @@ Select on other schema::
 Insert query with default values::
 
     >>> tuple(user.insert())
-    ('INSERT INTO "user" AS "a" DEFAULT VALUES', ())
+    ('INSERT INTO "user" DEFAULT VALUES', ())
 
 Insert query with values::
 
     >>> tuple(user.insert(columns=[user.name, user.login],
     ...         values=[['Foo', 'foo']]))
-    ('INSERT INTO "user" AS "a" ("name", "login") VALUES (%s, %s)', ('Foo', 'foo'))
+    ('INSERT INTO "user" ("name", "login") VALUES (%s, %s)', ('Foo', 'foo'))
     >>> tuple(user.insert(columns=[user.name, user.login],
     ...         values=[['Foo', 'foo'], ['Bar', 'bar']]))
-    ('INSERT INTO "user" AS "a" ("name", "login") VALUES (%s, %s), (%s, %s)', ('Foo', 'foo', 'Bar', 'bar'))
+    ('INSERT INTO "user" ("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" AS "b" SELECT "a"."login", "a"."passwd" FROM "passwd" AS "a"', ())
+    ('INSERT INTO "user" SELECT "a"."login", "a"."passwd" FROM "passwd" AS "a"', ())
 
 Update query with values::
 
@@ -166,23 +166,23 @@ Flavors::
     >>> select.offset = 10
     >>> Flavor.set(Flavor())
     >>> tuple(select)
-    ('SELECT * FROM "user" AS "a" OFFSET 10', ())
+    ('SELECT * FROM "user" AS "a" OFFSET %s', (10,))
     >>> Flavor.set(Flavor(max_limit=18446744073709551615))
     >>> tuple(select)
-    ('SELECT * FROM "user" AS "a" LIMIT 18446744073709551615 OFFSET 10', ())
+    ('SELECT * FROM "user" AS "a" LIMIT 18446744073709551615 OFFSET %s', (10,))
     >>> Flavor.set(Flavor(max_limit=-1))
     >>> tuple(select)
-    ('SELECT * FROM "user" AS "a" LIMIT -1 OFFSET 10', ())
+    ('SELECT * FROM "user" AS "a" LIMIT -1 OFFSET %s', (10,))
 
 Limit style::
 
     >>> select = user.select(limit=10, offset=20)
     >>> Flavor.set(Flavor(limitstyle='limit'))
     >>> tuple(select)
-    ('SELECT * FROM "user" AS "a" LIMIT 10 OFFSET 20', ())
+    ('SELECT * FROM "user" AS "a" LIMIT %s OFFSET %s', (10, 20))
     >>> Flavor.set(Flavor(limitstyle='fetch'))
     >>> tuple(select)
-    ('SELECT * FROM "user" AS "a" OFFSET (20) ROWS FETCH FIRST (10) ROWS ONLY', ())
+    ('SELECT * FROM "user" AS "a" OFFSET (%s) ROWS FETCH FIRST (%s) ROWS ONLY', (20, 10))
     >>> Flavor.set(Flavor(limitstyle='rownum'))
     >>> tuple(select)
     ('SELECT "a".* FROM (SELECT "b".*, ROWNUM AS "rnum" FROM (SELECT * FROM "user" AS "c") AS "b" WHERE (ROWNUM <= %s)) AS "a" WHERE ("rnum" > %s)', (30, 20))
diff -pruN 1.5.2-2/debian/changelog 1.6.0-1/debian/changelog
--- 1.5.2-2/debian/changelog	2025-04-09 06:56:14.000000000 +0000
+++ 1.6.0-1/debian/changelog	2025-11-10 10:55:38.000000000 +0000
@@ -1,3 +1,10 @@
+python-sql (1.6.0-1) unstable; urgency=medium
+
+  * Merging upstream version 1.6.0.
+  * Updating copyright file.
+
+ -- Mathias Behrle <mathiasb@m9s.biz>  Mon, 10 Nov 2025 11:55:38 +0100
+
 python-sql (1.5.2-2) unstable; urgency=medium
 
   * Add CVE number CVE-2024-9774 to changelog.
diff -pruN 1.5.2-2/debian/copyright 1.6.0-1/debian/copyright
--- 1.5.2-2/debian/copyright	2025-04-09 06:56:14.000000000 +0000
+++ 1.6.0-1/debian/copyright	2025-11-10 10:55:38.000000000 +0000
@@ -2,13 +2,13 @@ Format: https://www.debian.org/doc/packa
 Upstream-Name: python-sql
 
 Files: *
-Copyright: 2011-2024 , Cédric Krier
-           2013-2023 , Nicolas Évrard
-           2011-2024 , B2CK
+Copyright: 2011-2025 , Cédric Krier
+           2013-2025 , Nicolas Évrard
+           2011-2025 , B2CK
 License: BSD-3-clause
 
 Files: debian/*
-Copyright: 2013-2024 Mathias Behrle <mathiasb@m9s.biz>
+Copyright: 2013-2025 Mathias Behrle <mathiasb@m9s.biz>
 License: BSD-3-clause
 
 License: BSD-3-clause
diff -pruN 1.5.2-2/python_sql.egg-info/PKG-INFO 1.6.0-1/python_sql.egg-info/PKG-INFO
--- 1.5.2-2/python_sql.egg-info/PKG-INFO	2024-09-30 20:43:58.000000000 +0000
+++ 1.6.0-1/python_sql.egg-info/PKG-INFO	2025-05-02 19:54:47.000000000 +0000
@@ -1,6 +1,6 @@
-Metadata-Version: 2.1
+Metadata-Version: 2.4
 Name: python-sql
-Version: 1.5.2
+Version: 1.6.0
 Summary: Library to write SQL queries
 Home-page: https://pypi.org/project/python-sql/
 Download-URL: https://downloads.tryton.org/python-sql/
@@ -24,9 +24,21 @@ Classifier: Programming Language :: Pyth
 Classifier: Programming Language :: Python :: 3.10
 Classifier: Programming Language :: Python :: 3.11
 Classifier: Programming Language :: Python :: 3.12
+Classifier: Programming Language :: Python :: 3.13
 Classifier: Topic :: Database
 Classifier: Topic :: Software Development :: Libraries :: Python Modules
 Requires-Python: >=3.5
+Dynamic: author
+Dynamic: author-email
+Dynamic: classifier
+Dynamic: description
+Dynamic: download-url
+Dynamic: home-page
+Dynamic: keywords
+Dynamic: license
+Dynamic: project-url
+Dynamic: requires-python
+Dynamic: summary
 
 python-sql
 ==========
@@ -136,23 +148,23 @@ Select on other schema::
 Insert query with default values::
 
     >>> tuple(user.insert())
-    ('INSERT INTO "user" AS "a" DEFAULT VALUES', ())
+    ('INSERT INTO "user" DEFAULT VALUES', ())
 
 Insert query with values::
 
     >>> tuple(user.insert(columns=[user.name, user.login],
     ...         values=[['Foo', 'foo']]))
-    ('INSERT INTO "user" AS "a" ("name", "login") VALUES (%s, %s)', ('Foo', 'foo'))
+    ('INSERT INTO "user" ("name", "login") VALUES (%s, %s)', ('Foo', 'foo'))
     >>> tuple(user.insert(columns=[user.name, user.login],
     ...         values=[['Foo', 'foo'], ['Bar', 'bar']]))
-    ('INSERT INTO "user" AS "a" ("name", "login") VALUES (%s, %s), (%s, %s)', ('Foo', 'foo', 'Bar', 'bar'))
+    ('INSERT INTO "user" ("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" AS "b" SELECT "a"."login", "a"."passwd" FROM "passwd" AS "a"', ())
+    ('INSERT INTO "user" SELECT "a"."login", "a"."passwd" FROM "passwd" AS "a"', ())
 
 Update query with values::
 
@@ -196,23 +208,23 @@ Flavors::
     >>> select.offset = 10
     >>> Flavor.set(Flavor())
     >>> tuple(select)
-    ('SELECT * FROM "user" AS "a" OFFSET 10', ())
+    ('SELECT * FROM "user" AS "a" OFFSET %s', (10,))
     >>> Flavor.set(Flavor(max_limit=18446744073709551615))
     >>> tuple(select)
-    ('SELECT * FROM "user" AS "a" LIMIT 18446744073709551615 OFFSET 10', ())
+    ('SELECT * FROM "user" AS "a" LIMIT 18446744073709551615 OFFSET %s', (10,))
     >>> Flavor.set(Flavor(max_limit=-1))
     >>> tuple(select)
-    ('SELECT * FROM "user" AS "a" LIMIT -1 OFFSET 10', ())
+    ('SELECT * FROM "user" AS "a" LIMIT -1 OFFSET %s', (10,))
 
 Limit style::
 
     >>> select = user.select(limit=10, offset=20)
     >>> Flavor.set(Flavor(limitstyle='limit'))
     >>> tuple(select)
-    ('SELECT * FROM "user" AS "a" LIMIT 10 OFFSET 20', ())
+    ('SELECT * FROM "user" AS "a" LIMIT %s OFFSET %s', (10, 20))
     >>> Flavor.set(Flavor(limitstyle='fetch'))
     >>> tuple(select)
-    ('SELECT * FROM "user" AS "a" OFFSET (20) ROWS FETCH FIRST (10) ROWS ONLY', ())
+    ('SELECT * FROM "user" AS "a" OFFSET (%s) ROWS FETCH FIRST (%s) ROWS ONLY', (20, 10))
     >>> Flavor.set(Flavor(limitstyle='rownum'))
     >>> tuple(select)
     ('SELECT "a".* FROM (SELECT "b".*, ROWNUM AS "rnum" FROM (SELECT * FROM "user" AS "c") AS "b" WHERE (ROWNUM <= %s)) AS "a" WHERE ("rnum" > %s)', (30, 20))
diff -pruN 1.5.2-2/setup.py 1.6.0-1/setup.py
--- 1.5.2-2/setup.py	2024-09-30 20:40:59.000000000 +0000
+++ 1.6.0-1/setup.py	2025-05-01 12:27:06.000000000 +0000
@@ -48,6 +48,7 @@ setup(name='python-sql',
         'Programming Language :: Python :: 3.10',
         'Programming Language :: Python :: 3.11',
         'Programming Language :: Python :: 3.12',
+        'Programming Language :: Python :: 3.13',
         'Topic :: Database',
         'Topic :: Software Development :: Libraries :: Python Modules',
         ],
diff -pruN 1.5.2-2/sql/__init__.py 1.6.0-1/sql/__init__.py
--- 1.5.2-2/sql/__init__.py	2024-09-30 20:40:59.000000000 +0000
+++ 1.6.0-1/sql/__init__.py	2025-05-02 19:52:46.000000000 +0000
@@ -7,7 +7,7 @@ from collections import defaultdict
 from itertools import chain
 from threading import current_thread, local
 
-__version__ = '1.5.2'
+__version__ = '1.6.0'
 __all__ = [
     'Flavor', 'Table', 'Values', 'Literal', 'Column', 'Grouping', 'Conflict',
     'Matched', 'MatchedUpdate', 'MatchedDelete',
@@ -182,7 +182,7 @@ def format2numeric(query, params):
 
 
 class Query(object):
-    __slots__ = ()
+    __slots__ = ('__weakref__',)
 
     @property
     def params(self):
@@ -243,7 +243,7 @@ class WithQuery(Query):
 
 
 class FromItem(object):
-    __slots__ = ()
+    __slots__ = ('__weakref__',)
 
     @property
     def alias(self):
@@ -692,13 +692,13 @@ class Select(FromItem, SelectQuery):
             if self.group_by:
                 for expression in self.group_by:
                     p.extend(expression.params)
-            if self.order_by:
-                for expression in self.order_by:
-                    p.extend(expression.params)
             if self.having:
                 p.extend(self.having.params)
             for window in self.windows:
                 p.extend(window.params)
+            if self.order_by:
+                for expression in self.order_by:
+                    p.extend(expression.params)
             p.extend(self._limit_offset_params)
         return tuple(p)
 
@@ -1615,7 +1615,7 @@ class Values(list, Query, FromItem):
 
 
 class Expression(object):
-    __slots__ = ()
+    __slots__ = ('__weakref__',)
 
     def __str__(self):
         raise NotImplementedError
@@ -1986,7 +1986,8 @@ class Cube(Rollup):
 
 class Window(object):
     __slots__ = (
-        '_partition', '_order_by', '_frame', '_start', '_end', '_exclude')
+        '_partition', '_order_by', '_frame', '_start', '_end', '_exclude',
+        '__weakref__')
 
     def __init__(self, partition, order_by=None,
             frame=None, start=None, end=0, exclude=None):
diff -pruN 1.5.2-2/sql/tests/__init__.py 1.6.0-1/sql/tests/__init__.py
--- 1.5.2-2/sql/tests/__init__.py	2022-04-27 16:41:54.000000000 +0000
+++ 1.6.0-1/sql/tests/__init__.py	2025-05-01 12:27:06.000000000 +0000
@@ -6,7 +6,7 @@ import os
 import sql
 
 here = os.path.dirname(__file__)
-readme = os.path.normpath(os.path.join(here, '..', '..', 'README'))
+readme = os.path.normpath(os.path.join(here, '..', '..', 'README.rst'))
 
 
 def load_tests(loader, tests, pattern):
diff -pruN 1.5.2-2/sql/tests/test_select.py 1.6.0-1/sql/tests/test_select.py
--- 1.5.2-2/sql/tests/test_select.py	2024-05-29 22:04:05.000000000 +0000
+++ 1.6.0-1/sql/tests/test_select.py	2025-05-02 07:15:27.000000000 +0000
@@ -531,14 +531,24 @@ class TestSelect(unittest.TestCase):
     def test_order_params(self):
         with_ = With(query=self.table.select(self.table.c,
                 where=(self.table.c > 1)))
-        w = Window([Literal(8)])
+        w = Window([Literal(7)])
         query = Select([Literal(2), Min(self.table.c, window=w)],
             from_=self.table.select(where=self.table.c > 3),
             with_=with_,
             where=self.table.c > 4,
             group_by=[Literal(5)],
-            order_by=[Literal(6)],
-            having=Literal(7))
+            having=Literal(6),
+            order_by=[Literal(8)])
+        self.assertEqual(
+            str(query),
+            'WITH "c" AS (SELECT "a"."c" FROM "t" AS "a" WHERE ("a"."c" > %s))'
+            ' SELECT %s, MIN("a"."c") OVER "b" '
+            'FROM SELECT * FROM "t" AS "a" WHERE ("a"."c" > %s) '
+            'WHERE ("a"."c" > %s) '
+            'GROUP BY %s '
+            'HAVING %s '
+            'WINDOW "b" AS (PARTITION BY %s) '
+            'ORDER BY %s')
         self.assertEqual(tuple(query.params), (1, 2, 3, 4, 5, 6, 7, 8))
 
     def test_no_as(self):
diff -pruN 1.5.2-2/tox.ini 1.6.0-1/tox.ini
--- 1.5.2-2/tox.ini	2024-09-30 20:40:59.000000000 +0000
+++ 1.6.0-1/tox.ini	2025-05-01 12:27:06.000000000 +0000
@@ -4,7 +4,7 @@
 # and then run "tox" from this directory.
 
 [tox]
-envlist = py35, py36, py37, py38, py39, py310, py311, py312, pypy3
+envlist = py35, py36, py37, py38, py39, py310, py311, py312, py313, pypy3
 
 [testenv]
 usedevelop = true
