242 lines
9.9 KiB
Python
242 lines
9.9 KiB
Python
#------------------------------------------------------------------------------
|
|
# Copyright (c) 2020, 2022, Oracle and/or its affiliates.
|
|
#
|
|
# This software is dual-licensed to you under the Universal Permissive License
|
|
# (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl and Apache License
|
|
# 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose
|
|
# either license.
|
|
#
|
|
# If you elect to accept the software under the Apache License, Version 2.0,
|
|
# the following applies:
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# https://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
#------------------------------------------------------------------------------
|
|
|
|
"""
|
|
4200 - Module for testing scrollable cursors
|
|
"""
|
|
|
|
import unittest
|
|
|
|
import oracledb
|
|
import test_env
|
|
|
|
@unittest.skipIf(test_env.get_is_thin(),
|
|
"thin mode doesn't support scrollable cursors yet")
|
|
class TestCase(test_env.BaseTestCase):
|
|
|
|
def test_4200_create_scrollable_cursor(self):
|
|
"4200 - test creating a scrollable cursor"
|
|
cursor = self.connection.cursor()
|
|
self.assertEqual(cursor.scrollable, False)
|
|
cursor = self.connection.cursor(True)
|
|
self.assertEqual(cursor.scrollable, True)
|
|
cursor = self.connection.cursor(scrollable=True)
|
|
self.assertEqual(cursor.scrollable, True)
|
|
cursor.scrollable = False
|
|
self.assertEqual(cursor.scrollable, False)
|
|
|
|
def test_4201_scroll_absolute_exception_after(self):
|
|
"4201 - test scrolling absolute yields an exception (after result set)"
|
|
cursor = self.connection.cursor(scrollable=True)
|
|
cursor.arraysize = self.cursor.arraysize
|
|
cursor.execute("""
|
|
select NumberCol
|
|
from TestNumbers
|
|
order by IntCol""")
|
|
self.assertRaisesRegex(oracledb.DatabaseError, "^DPI-1027:",
|
|
cursor.scroll, 12, "absolute")
|
|
|
|
def test_4202_scroll_absolute_in_buffer(self):
|
|
"4202 - test scrolling absolute (when in buffers)"
|
|
cursor = self.connection.cursor(scrollable=True)
|
|
cursor.arraysize = self.cursor.arraysize
|
|
cursor.execute("""
|
|
select NumberCol
|
|
from TestNumbers
|
|
order by IntCol""")
|
|
cursor.fetchmany()
|
|
self.assertTrue(cursor.arraysize > 1,
|
|
"array size must exceed 1 for this test to work correctly")
|
|
cursor.scroll(1, mode="absolute")
|
|
row = cursor.fetchone()
|
|
self.assertEqual(row[0], 1.25)
|
|
self.assertEqual(cursor.rowcount, 1)
|
|
|
|
def test_4203_scroll_absolute_not_in_buffer(self):
|
|
"4203 - test scrolling absolute (when not in buffers)"
|
|
cursor = self.connection.cursor(scrollable=True)
|
|
cursor.arraysize = self.cursor.arraysize
|
|
cursor.execute("""
|
|
select NumberCol
|
|
from TestNumbers
|
|
order by IntCol""")
|
|
cursor.scroll(6, mode="absolute")
|
|
row = cursor.fetchone()
|
|
self.assertEqual(row[0], 7.5)
|
|
self.assertEqual(cursor.rowcount, 6)
|
|
|
|
def test_4204_scroll_first_in_buffer(self):
|
|
"4204 - test scrolling to first row in result set (in buffers)"
|
|
cursor = self.connection.cursor(scrollable=True)
|
|
cursor.arraysize = self.cursor.arraysize
|
|
cursor.execute("""
|
|
select NumberCol
|
|
from TestNumbers
|
|
order by IntCol""")
|
|
cursor.fetchmany()
|
|
cursor.scroll(mode="first")
|
|
row = cursor.fetchone()
|
|
self.assertEqual(row[0], 1.25)
|
|
self.assertEqual(cursor.rowcount, 1)
|
|
|
|
def test_4205_scroll_first_not_in_buffer(self):
|
|
"4205 - test scrolling to first row in result set (not in buffers)"
|
|
cursor = self.connection.cursor(scrollable=True)
|
|
cursor.arraysize = self.cursor.arraysize
|
|
cursor.execute("""
|
|
select NumberCol
|
|
from TestNumbers
|
|
order by IntCol""")
|
|
cursor.fetchmany()
|
|
cursor.fetchmany()
|
|
cursor.scroll(mode="first")
|
|
row = cursor.fetchone()
|
|
self.assertEqual(row[0], 1.25)
|
|
self.assertEqual(cursor.rowcount, 1)
|
|
|
|
def test_4206_scroll_last(self):
|
|
"4206 - test scrolling to last row in result set"
|
|
cursor = self.connection.cursor(scrollable=True)
|
|
cursor.arraysize = self.cursor.arraysize
|
|
cursor.execute("""
|
|
select NumberCol
|
|
from TestNumbers
|
|
order by IntCol""")
|
|
cursor.scroll(mode="last")
|
|
row = cursor.fetchone()
|
|
self.assertEqual(row[0], 12.5)
|
|
self.assertEqual(cursor.rowcount, 10)
|
|
|
|
def test_4207_scroll_relative_exception_after(self):
|
|
"4207 - test scrolling relative yields an exception (after result set)"
|
|
cursor = self.connection.cursor(scrollable=True)
|
|
cursor.arraysize = self.cursor.arraysize
|
|
cursor.execute("""
|
|
select NumberCol
|
|
from TestNumbers
|
|
order by IntCol""")
|
|
self.assertRaisesRegex(oracledb.DatabaseError, "^DPI-1027:",
|
|
cursor.scroll, 15)
|
|
|
|
def test_4208_scroll_relative_exception_before(self):
|
|
"4208 - test scrolling relative yields exception (before result set)"
|
|
cursor = self.connection.cursor(scrollable=True)
|
|
cursor.arraysize = self.cursor.arraysize
|
|
cursor.execute("""
|
|
select NumberCol
|
|
from TestNumbers
|
|
order by IntCol""")
|
|
self.assertRaisesRegex(oracledb.DatabaseError, "^DPI-1027:",
|
|
cursor.scroll, -5)
|
|
|
|
def test_4209_scroll_relative_in_buffer(self):
|
|
"4209 - test scrolling relative (when in buffers)"
|
|
cursor = self.connection.cursor(scrollable=True)
|
|
cursor.arraysize = self.cursor.arraysize
|
|
cursor.execute("""
|
|
select NumberCol
|
|
from TestNumbers
|
|
order by IntCol""")
|
|
cursor.fetchmany()
|
|
message = "array size must exceed 1 for this test to work correctly"
|
|
self.assertTrue(cursor.arraysize > 1, message)
|
|
cursor.scroll(2 - cursor.rowcount)
|
|
row = cursor.fetchone()
|
|
self.assertEqual(row[0], 2.5)
|
|
self.assertEqual(cursor.rowcount, 2)
|
|
|
|
def test_4210_scroll_relative_not_in_buffer(self):
|
|
"4210 - test scrolling relative (when not in buffers)"
|
|
cursor = self.connection.cursor(scrollable=True)
|
|
cursor.arraysize = self.cursor.arraysize
|
|
cursor.execute("""
|
|
select NumberCol
|
|
from TestNumbers
|
|
order by IntCol""")
|
|
cursor.fetchmany()
|
|
cursor.fetchmany()
|
|
message = "array size must exceed 1 for this test to work correctly"
|
|
self.assertTrue(cursor.arraysize > 1, message)
|
|
cursor.scroll(3 - cursor.rowcount)
|
|
row = cursor.fetchone()
|
|
self.assertEqual(row[0], 3.75)
|
|
self.assertEqual(cursor.rowcount, 3)
|
|
|
|
def test_4211_scroll_no_rows(self):
|
|
"4211 - test scrolling when there are no rows"
|
|
self.cursor.execute("truncate table TestTempTable")
|
|
cursor = self.connection.cursor(scrollable=True)
|
|
cursor.execute("select * from TestTempTable")
|
|
cursor.scroll(mode="last")
|
|
self.assertEqual(cursor.fetchall(), [])
|
|
cursor.scroll(mode="first")
|
|
self.assertEqual(cursor.fetchall(), [])
|
|
self.assertRaisesRegex(oracledb.DatabaseError, "^DPI-1027:",
|
|
cursor.scroll, 1, mode="absolute")
|
|
|
|
def test_4212_scroll_differing_array_and_fetch_sizes(self):
|
|
"4212 - test scrolling with differing array and fetch array sizes"
|
|
self.cursor.execute("truncate table TestTempTable")
|
|
for i in range(30):
|
|
self.cursor.execute("""
|
|
insert into TestTempTable (IntCol, StringCol1)
|
|
values (:1, null)""",
|
|
(i + 1,))
|
|
for arraysize in range(1, 6):
|
|
cursor = self.connection.cursor(scrollable = True)
|
|
cursor.arraysize = arraysize
|
|
cursor.execute("select IntCol from TestTempTable order by IntCol")
|
|
for num_rows in range(1, arraysize + 1):
|
|
cursor.scroll(15, "absolute")
|
|
rows = cursor.fetchmany(num_rows)
|
|
self.assertEqual(rows[0][0], 15)
|
|
self.assertEqual(cursor.rowcount, 15 + num_rows - 1)
|
|
cursor.scroll(9)
|
|
rows = cursor.fetchmany(num_rows)
|
|
num_rows_fetched = len(rows)
|
|
self.assertEqual(rows[0][0], 15 + num_rows + 8)
|
|
self.assertEqual(cursor.rowcount,
|
|
15 + num_rows + num_rows_fetched + 7)
|
|
cursor.scroll(-12)
|
|
rows = cursor.fetchmany(num_rows)
|
|
count = 15 + num_rows + num_rows_fetched - 5
|
|
self.assertEqual(rows[0][0], count)
|
|
count = 15 + num_rows + num_rows_fetched + num_rows - 6
|
|
self.assertEqual(cursor.rowcount, count)
|
|
|
|
def test_4213_scroll_with_invalid_mode(self):
|
|
"4213 - test calling scroll() with invalid mode"
|
|
cursor = self.connection.cursor(scrollable=True)
|
|
cursor.arraysize = self.cursor.arraysize
|
|
cursor.execute("""
|
|
select NumberCol
|
|
from TestNumbers
|
|
order by IntCol""")
|
|
cursor.fetchmany()
|
|
self.assertRaisesRegex(oracledb.ProgrammingError, "^DPY-2009:",
|
|
cursor.scroll, mode="middle")
|
|
|
|
if __name__ == "__main__":
|
|
test_env.run_test_cases()
|