]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
cleaned multiple framespec clause check
authorKaan <kaan191@gmail.com>
Wed, 19 Mar 2025 06:34:47 +0000 (06:34 +0000)
committerKaan <kaan191@gmail.com>
Wed, 19 Mar 2025 06:34:47 +0000 (06:34 +0000)
lib/sqlalchemy/sql/elements.py
test/sql/test_compiler.py

index 9d8b00b8549c9204b2fe8205674ca03216fd0d8b..ce35ac5e6146c86e183ba6be67e3a4eba78508f2 100644 (file)
@@ -4246,23 +4246,14 @@ class Over(ColumnElement[_T]):
                 _literal_as_text_role=roles.ByOfRole,
             )
 
-        # validate frame spec and assign clause
-        _frame_spec_map = {"range_": range_, "rows": rows, "groups": groups}
-        if sum([v is not None for v in _frame_spec_map.values()]) > 1:
-            _clauses = [
-                f"'{k}'"
-                for i, k in enumerate(_frame_spec_map.keys())
-                if list(_frame_spec_map.values())[i]
-            ]
-            _clauses_str = ' and '.join(_clauses)
+        if (range_ and (rows or groups)) or (rows and (range_ or groups)):
             raise exc.ArgumentError(
-                f"too many frame spec clauses provided: {_clauses_str}"
+                "only one of 'rows', 'range_', or 'groups' may be provided"
             )
         else:
-            self.range_, self.rows, self.groups = [
-                (_FrameClause(v) if v else None)
-                for v in _frame_spec_map.values()
-            ]
+            self.range_ = _FrameClause(range_) if range_ else None
+            self.rows = _FrameClause(rows) if rows else None
+            self.groups = _FrameClause(groups) if groups else None
 
     if not TYPE_CHECKING:
 
index 0f701e9872b7920f2e7856ceebb55d0df4535864..aa6e3275ce28817551bdca25c539cd0340f5433e 100644 (file)
@@ -3260,8 +3260,7 @@ class SelectTest(fixtures.TestBase, AssertsCompiledSQL):
 
         assert_raises_message(
             exc.ArgumentError,
-            "too many frame spec clauses provided: "
-            "'range_' and 'rows'",
+            "only one of 'rows', 'range_', or 'groups' may be provided",
             func.row_number().over,
             range_=(-5, 8),
             rows=(-2, 5),
@@ -3269,8 +3268,7 @@ class SelectTest(fixtures.TestBase, AssertsCompiledSQL):
 
         assert_raises_message(
             exc.ArgumentError,
-            "too many frame spec clauses provided: "
-            "'range_' and 'groups'",
+            "only one of 'rows', 'range_', or 'groups' may be provided",
             func.row_number().over,
             range_=(-5, 8),
             groups=(None, None),
@@ -3278,8 +3276,7 @@ class SelectTest(fixtures.TestBase, AssertsCompiledSQL):
 
         assert_raises_message(
             exc.ArgumentError,
-            "too many frame spec clauses provided: "
-            "'rows' and 'groups'",
+            "only one of 'rows', 'range_', or 'groups' may be provided",
             func.row_number().over,
             rows=(-2, 5),
             groups=(None, None),
@@ -3287,8 +3284,7 @@ class SelectTest(fixtures.TestBase, AssertsCompiledSQL):
 
         assert_raises_message(
             exc.ArgumentError,
-            "too many frame spec clauses provided: "
-            "'range_' and 'rows' and 'groups'",
+            "only one of 'rows', 'range_', or 'groups' may be provided",
             func.row_number().over,
             range_=(-5, 8),
             rows=(-2, 5),