@@ -44,16 +44,49 @@ def rows_returned(query):
4444
4545
4646class 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