Skip to content

Commit 2c6e9f8

Browse files
committed
[_600] prevent case-sensitive testing with BETWEEN where infeasible
1 parent f3a4fa7 commit 2c6e9f8

1 file changed

Lines changed: 52 additions & 22 deletions

File tree

irods/test/query_test.py

Lines changed: 52 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -44,16 +44,49 @@ def rows_returned(query):
4444

4545

4646
class TestQuery(unittest.TestCase):
47+
48+
_csq = None
49+
4750
Iterate_to_exhaust_statement_table = range(IRODS_STATEMENT_TABLE_SIZE + 1)
4851

4952
More_than_one_batch = 2 * MAX_SQL_ROWS # may need to increase if PRC default page
5053
# size is increased beyond 500
5154

5255
register_resc = ""
5356

57+
@property
58+
def case_sensitive_testing_feasible(self):
59+
"""
60+
Return result of the probe into whether lexical order of query columns has been found compatible with
61+
case sensitive operators such as >, <, between. (MySQL can fail in the default DB configuration,
62+
whereas PostgreSQL does not).
63+
"""
64+
return self._csq in (True,)
65+
66+
@staticmethod
67+
def _query_columns_case_sensitive_by_default(ses):
68+
home = helpers.home_collection(ses)
69+
data_objs = []
70+
try:
71+
for x in ('a', 'b', 'A', 'B'):
72+
data_objs.append(ses.data_objects.create(f'{home}/{x}'))
73+
lower = { r[DataObject.name] for r in ses.query(DataObject.name).filter(DataObject.name >= 'a', DataObject.name <= 'b') }
74+
if {'A','B'} & lower:
75+
return False
76+
upper = { r[DataObject.name] for r in ses.query(DataObject.name).filter(DataObject.name >= 'A', DataObject.name <= 'B') }
77+
if {'a','b'} & upper:
78+
return False
79+
return True
80+
finally:
81+
for d in data_objs:
82+
d.unlink(force=True)
83+
5484
@classmethod
5585
def setUpClass(cls):
5686
with helpers.make_session() as sess:
87+
if cls._csq is None:
88+
cls._csq = cls._query_columns_case_sensitive_by_default(sess)
89+
5790
resource_name = helpers.get_register_resource(sess)
5891
if resource_name:
5992
cls.register_resc = resource_name
@@ -214,28 +247,25 @@ def test_files_query_case_sensitive(self):
214247
self.assertEqual(len(result12), 0)
215248

216249
# BETWEEN tests
217-
218-
# TODO(#600): Uncomment these lines and/or make a new test when database flavor can be detected.
219-
# The resultset for BETWEEN queries can differ from database to database.
220-
221-
# result13 = self.sess.query(DataObject.name).filter(
222-
# Collection.name == self.coll_path).filter(
223-
# Between(DataObject.name, [self.case_sensitive_obj_name1,
224-
# self.case_sensitive_obj_name1 + "_"])).all()
225-
# self.assertTrue(result13.has_value(self.case_sensitive_obj_name1))
226-
# self.assertEqual(len(result13), 1)
227-
228-
# result14 = self.sess.query(DataObject.name).filter(
229-
# Collection.name == self.coll_path).filter(
230-
# Between(DataObject.name, [str.lower(self.case_sensitive_obj_name1),
231-
# str.lower(self.case_sensitive_obj_name1) + "_"])).all()
232-
# self.assertEqual(len(result14), 0)
233-
234-
# result15 = self.sess.query(DataObject.name).filter(
235-
# Collection.name == self.coll_path).filter(
236-
# Between(DataObject.name, [str.upper(self.case_sensitive_obj_name1),
237-
# str.upper(self.case_sensitive_obj_name1) + "_"])).all()
238-
# self.assertEqual(len(result15), 0)
250+
if self.case_sensitive_testing_feasible:
251+
result13 = self.sess.query(DataObject.name).filter(
252+
Collection.name == self.coll_path).filter(
253+
Between(DataObject.name, [self.case_sensitive_obj_name1,
254+
self.case_sensitive_obj_name1 + "_"])).all()
255+
self.assertTrue(result13.has_value(self.case_sensitive_obj_name1))
256+
self.assertEqual(len(result13), 1)
257+
258+
result14 = self.sess.query(DataObject.name).filter(
259+
Collection.name == self.coll_path).filter(
260+
Between(DataObject.name, [str.lower(self.case_sensitive_obj_name1),
261+
str.lower(self.case_sensitive_obj_name1) + "_"])).all()
262+
self.assertEqual(len(result14), 0)
263+
264+
result15 = self.sess.query(DataObject.name).filter(
265+
Collection.name == self.coll_path).filter(
266+
Between(DataObject.name, [str.upper(self.case_sensitive_obj_name1),
267+
str.upper(self.case_sensitive_obj_name1) + "_"])).all()
268+
self.assertEqual(len(result15), 0)
239269

240270
def test_files_query_case_insensitive(self):
241271
# This tests that GenQueries are case-insensitive when the case_sensitive

0 commit comments

Comments
 (0)