@@ -2059,69 +2059,18 @@ def make_in_list_sql_clause(
20592059KV = TypeVar ("KV" )
20602060
20612061
2062- def make_tuple_comparison_clause (
2063- database_engine : BaseDatabaseEngine , keys : List [Tuple [str , KV ]]
2064- ) -> Tuple [str , List [KV ]]:
2062+ def make_tuple_comparison_clause (keys : List [Tuple [str , KV ]]) -> Tuple [str , List [KV ]]:
20652063 """Returns a tuple comparison SQL clause
20662064
2067- Depending what the SQL engine supports, builds a SQL clause that looks like either
2068- "(a, b) > (?, ?)", or "(a > ?) OR (a == ? AND b > ?)".
2065+ Builds a SQL clause that looks like "(a, b) > (?, ?)"
20692066
20702067 Args:
2071- database_engine
20722068 keys: A set of (column, value) pairs to be compared.
20732069
20742070 Returns:
20752071 A tuple of SQL query and the args
20762072 """
2077- if database_engine .supports_tuple_comparison :
2078- return (
2079- "(%s) > (%s)" % ("," .join (k [0 ] for k in keys ), "," .join ("?" for _ in keys )),
2080- [k [1 ] for k in keys ],
2081- )
2082-
2083- # we want to build a clause
2084- # (a > ?) OR
2085- # (a == ? AND b > ?) OR
2086- # (a == ? AND b == ? AND c > ?)
2087- # ...
2088- # (a == ? AND b == ? AND ... AND z > ?)
2089- #
2090- # or, equivalently:
2091- #
2092- # (a > ? OR (a == ? AND
2093- # (b > ? OR (b == ? AND
2094- # ...
2095- # (y > ? OR (y == ? AND
2096- # z > ?
2097- # ))
2098- # ...
2099- # ))
2100- # ))
2101- #
2102- # which itself is equivalent to (and apparently easier for the query optimiser):
2103- #
2104- # (a >= ? AND (a > ? OR
2105- # (b >= ? AND (b > ? OR
2106- # ...
2107- # (y >= ? AND (y > ? OR
2108- # z > ?
2109- # ))
2110- # ...
2111- # ))
2112- # ))
2113- #
2114- #
2115-
2116- clause = ""
2117- args = [] # type: List[KV]
2118- for k , v in keys [:- 1 ]:
2119- clause = clause + "(%s >= ? AND (%s > ? OR " % (k , k )
2120- args .extend ([v , v ])
2121-
2122- (k , v ) = keys [- 1 ]
2123- clause += "%s > ?" % (k ,)
2124- args .append (v )
2125-
2126- clause += "))" * (len (keys ) - 1 )
2127- return clause , args
2073+ return (
2074+ "(%s) > (%s)" % ("," .join (k [0 ] for k in keys ), "," .join ("?" for _ in keys )),
2075+ [k [1 ] for k in keys ],
2076+ )
0 commit comments