6
0
mirror of https://github.com/FirebirdSQL/firebird-qa.git synced 2025-01-22 13:33:07 +01:00

Added/Updated tests\bugs\gh_6545_test.py: Checked on 4.0.0.436, 5.0.2.1478, 4.0.6.3142. NOTE: TEST REQUIRES FIREBIRD-DRIVER VERSION 1.10.6+

This commit is contained in:
pavel-zotov 2024-08-15 22:03:24 +03:00
parent 572c7c78b0
commit 2333bc1db1

689
tests/bugs/gh_6545_test.py Normal file
View File

@ -0,0 +1,689 @@
#coding:utf-8
"""
ID: issue-6545
ISSUE: https://github.com/FirebirdSQL/firebird/issues/6545
TITLE: Error writing to TIMESTAMP/TIME WITH TIME ZONE array
DESCRIPTION:
Test generates values which will be inserted into ARRAY columns defined as 'time with time zone' and 'timestamp with time zone'.
We process time zones defined in the FB_HOME/include/firebird/TimeZones.h (except several, see notes below),
and use every time zone value as argument to 'get_timezone()' in datetime.dsatetime / datetime.time calls.
Then we run DML which tries to insert tuple of generated data into appropriate ARRAY columns. This must not raise error.
Finally, we run query to get just inserted data and compare its result with input argument that was used in previous step.
NOTES:
[15.08.2024] pzotov
1. ### ACHTUNG ### TEST REQUIRES FIREBIRD-DRIVER VERSION 1.10.6+ (date: 15-aug-2024).
See also addition in firebird-driver doc:
https://firebird-driver.readthedocs.io/en/latest/usage-guide.html#working-with-time-timestamp-with-timezone
2. Following timezones present in $FB_HOME/include/firebird/TimeZones.h
and in https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
but are absent in pytz.all_timezones list:
America/Ciudad_Juarez
Europe/Kyiv
Pacific/Kanton
We have to SKIP them from handling.
Checked on 4.0.0.436, 5.0.2.1478, 4.0.6.3142
"""
import datetime
from firebird.driver import get_timezone
import random
import pytest
from firebird.qa import *
init_script = """
create table test (
arr_tmtz time with time zone [0:2]
,arr_tstz timestamp with time zone [0:2]
);
"""
db = db_factory(init = init_script)
act = python_act('db')
@pytest.mark.version('>=4.0')
def test_1(act: Action, capsys):
fb_time_zones = [
'Africa/Abidjan'
,'Africa/Accra'
,'Africa/Addis_Ababa'
,'Africa/Algiers'
,'Africa/Asmara'
,'Africa/Asmera'
,'Africa/Bamako'
,'Africa/Bangui'
,'Africa/Banjul'
,'Africa/Bissau'
,'Africa/Blantyre'
,'Africa/Brazzaville'
,'Africa/Bujumbura'
,'Africa/Cairo'
,'Africa/Casablanca'
,'Africa/Ceuta'
,'Africa/Conakry'
,'Africa/Dakar'
,'Africa/Dar_es_Salaam'
,'Africa/Djibouti'
,'Africa/Douala'
,'Africa/El_Aaiun'
,'Africa/Freetown'
,'Africa/Gaborone'
,'Africa/Harare'
,'Africa/Johannesburg'
,'Africa/Juba'
,'Africa/Kampala'
,'Africa/Khartoum'
,'Africa/Kigali'
,'Africa/Kinshasa'
,'Africa/Lagos'
,'Africa/Libreville'
,'Africa/Lome'
,'Africa/Luanda'
,'Africa/Lubumbashi'
,'Africa/Lusaka'
,'Africa/Malabo'
,'Africa/Maputo'
,'Africa/Maseru'
,'Africa/Mbabane'
,'Africa/Mogadishu'
,'Africa/Monrovia'
,'Africa/Nairobi'
,'Africa/Ndjamena'
,'Africa/Niamey'
,'Africa/Nouakchott'
,'Africa/Ouagadougou'
,'Africa/Porto-Novo'
,'Africa/Sao_Tome'
,'Africa/Timbuktu'
,'Africa/Tripoli'
,'Africa/Tunis'
,'Africa/Windhoek'
,'America/Adak'
,'America/Anchorage'
,'America/Anguilla'
,'America/Antigua'
,'America/Araguaina'
,'America/Argentina/Buenos_Aires'
,'America/Argentina/Catamarca'
,'America/Argentina/ComodRivadavia'
,'America/Argentina/Cordoba'
,'America/Argentina/Jujuy'
,'America/Argentina/La_Rioja'
,'America/Argentina/Mendoza'
,'America/Argentina/Rio_Gallegos'
,'America/Argentina/Salta'
,'America/Argentina/San_Juan'
,'America/Argentina/San_Luis'
,'America/Argentina/Tucuman'
,'America/Argentina/Ushuaia'
,'America/Aruba'
,'America/Asuncion'
,'America/Atikokan'
,'America/Atka'
,'America/Bahia'
,'America/Bahia_Banderas'
,'America/Barbados'
,'America/Belem'
,'America/Belize'
,'America/Blanc-Sablon'
,'America/Boa_Vista'
,'America/Bogota'
,'America/Boise'
,'America/Buenos_Aires'
,'America/Cambridge_Bay'
,'America/Campo_Grande'
,'America/Cancun'
,'America/Caracas'
,'America/Catamarca'
,'America/Cayenne'
,'America/Cayman'
,'America/Chicago'
,'America/Chihuahua'
# -- !! -- ,'America/Ciudad_Juarez'
,'America/Coral_Harbour'
,'America/Cordoba'
,'America/Costa_Rica'
,'America/Creston'
,'America/Cuiaba'
,'America/Curacao'
,'America/Danmarkshavn'
,'America/Dawson'
,'America/Dawson_Creek'
,'America/Denver'
,'America/Detroit'
,'America/Dominica'
,'America/Edmonton'
,'America/Eirunepe'
,'America/El_Salvador'
,'America/Ensenada'
,'America/Fort_Nelson'
,'America/Fort_Wayne'
,'America/Fortaleza'
,'America/Glace_Bay'
,'America/Godthab'
,'America/Goose_Bay'
,'America/Grand_Turk'
,'America/Grenada'
,'America/Guadeloupe'
,'America/Guatemala'
,'America/Guayaquil'
,'America/Guyana'
,'America/Halifax'
,'America/Havana'
,'America/Hermosillo'
,'America/Indiana/Indianapolis'
,'America/Indiana/Knox'
,'America/Indiana/Marengo'
,'America/Indiana/Petersburg'
,'America/Indiana/Tell_City'
,'America/Indiana/Vevay'
,'America/Indiana/Vincennes'
,'America/Indiana/Winamac'
,'America/Indianapolis'
,'America/Inuvik'
,'America/Iqaluit'
,'America/Jamaica'
,'America/Jujuy'
,'America/Juneau'
,'America/Kentucky/Louisville'
,'America/Kentucky/Monticello'
,'America/Knox_IN'
,'America/Kralendijk'
,'America/La_Paz'
,'America/Lima'
,'America/Los_Angeles'
,'America/Louisville'
,'America/Lower_Princes'
,'America/Maceio'
,'America/Managua'
,'America/Manaus'
,'America/Marigot'
,'America/Martinique'
,'America/Matamoros'
,'America/Mazatlan'
,'America/Mendoza'
,'America/Menominee'
,'America/Merida'
,'America/Metlakatla'
,'America/Mexico_City'
,'America/Miquelon'
,'America/Moncton'
,'America/Monterrey'
,'America/Montevideo'
,'America/Montreal'
,'America/Montserrat'
,'America/Nassau'
,'America/New_York'
,'America/Nipigon'
,'America/Nome'
,'America/Noronha'
,'America/North_Dakota/Beulah'
,'America/North_Dakota/Center'
,'America/North_Dakota/New_Salem'
,'America/Nuuk'
,'America/Ojinaga'
,'America/Panama'
,'America/Pangnirtung'
,'America/Paramaribo'
,'America/Phoenix'
,'America/Port-au-Prince'
,'America/Port_of_Spain'
,'America/Porto_Acre'
,'America/Porto_Velho'
,'America/Puerto_Rico'
,'America/Punta_Arenas'
,'America/Rainy_River'
,'America/Rankin_Inlet'
,'America/Recife'
,'America/Regina'
,'America/Resolute'
,'America/Rio_Branco'
,'America/Rosario'
,'America/Santa_Isabel'
,'America/Santarem'
,'America/Santiago'
,'America/Santo_Domingo'
,'America/Sao_Paulo'
,'America/Scoresbysund'
,'America/Shiprock'
,'America/Sitka'
,'America/St_Barthelemy'
,'America/St_Johns'
,'America/St_Kitts'
,'America/St_Lucia'
,'America/St_Thomas'
,'America/St_Vincent'
,'America/Swift_Current'
,'America/Tegucigalpa'
,'America/Thule'
,'America/Thunder_Bay'
,'America/Tijuana'
,'America/Toronto'
,'America/Tortola'
,'America/Vancouver'
,'America/Virgin'
,'America/Whitehorse'
,'America/Winnipeg'
,'America/Yakutat'
,'America/Yellowknife'
,'Antarctica/Casey'
,'Antarctica/Davis'
,'Antarctica/DumontDUrville'
,'Antarctica/Macquarie'
,'Antarctica/Mawson'
,'Antarctica/McMurdo'
,'Antarctica/Palmer'
,'Antarctica/Rothera'
,'Antarctica/South_Pole'
,'Antarctica/Syowa'
,'Antarctica/Troll'
,'Antarctica/Vostok'
,'Arctic/Longyearbyen'
,'Asia/Aden'
,'Asia/Almaty'
,'Asia/Amman'
,'Asia/Anadyr'
,'Asia/Aqtau'
,'Asia/Aqtobe'
,'Asia/Ashgabat'
,'Asia/Ashkhabad'
,'Asia/Atyrau'
,'Asia/Baghdad'
,'Asia/Bahrain'
,'Asia/Baku'
,'Asia/Bangkok'
,'Asia/Barnaul'
,'Asia/Beirut'
,'Asia/Bishkek'
,'Asia/Brunei'
,'Asia/Calcutta'
,'Asia/Chita'
,'Asia/Choibalsan'
,'Asia/Chongqing'
,'Asia/Chungking'
,'Asia/Colombo'
,'Asia/Dacca'
,'Asia/Damascus'
,'Asia/Dhaka'
,'Asia/Dili'
,'Asia/Dubai'
,'Asia/Dushanbe'
,'Asia/Famagusta'
,'Asia/Gaza'
,'Asia/Harbin'
,'Asia/Hebron'
,'Asia/Ho_Chi_Minh'
,'Asia/Hong_Kong'
,'Asia/Hovd'
,'Asia/Irkutsk'
,'Asia/Istanbul'
,'Asia/Jakarta'
,'Asia/Jayapura'
,'Asia/Jerusalem'
,'Asia/Kabul'
,'Asia/Kamchatka'
,'Asia/Karachi'
,'Asia/Kashgar'
,'Asia/Kathmandu'
,'Asia/Katmandu'
,'Asia/Khandyga'
,'Asia/Kolkata'
,'Asia/Krasnoyarsk'
,'Asia/Kuala_Lumpur'
,'Asia/Kuching'
,'Asia/Kuwait'
,'Asia/Macao'
,'Asia/Macau'
,'Asia/Magadan'
,'Asia/Makassar'
,'Asia/Manila'
,'Asia/Muscat'
,'Asia/Nicosia'
,'Asia/Novokuznetsk'
,'Asia/Novosibirsk'
,'Asia/Omsk'
,'Asia/Oral'
,'Asia/Phnom_Penh'
,'Asia/Pontianak'
,'Asia/Pyongyang'
,'Asia/Qatar'
,'Asia/Qostanay'
,'Asia/Qyzylorda'
,'Asia/Rangoon'
,'Asia/Riyadh'
,'Asia/Saigon'
,'Asia/Sakhalin'
,'Asia/Samarkand'
,'Asia/Seoul'
,'Asia/Shanghai'
,'Asia/Singapore'
,'Asia/Srednekolymsk'
,'Asia/Taipei'
,'Asia/Tashkent'
,'Asia/Tbilisi'
,'Asia/Tehran'
,'Asia/Tel_Aviv'
,'Asia/Thimbu'
,'Asia/Thimphu'
,'Asia/Tokyo'
,'Asia/Tomsk'
,'Asia/Ujung_Pandang'
,'Asia/Ulaanbaatar'
,'Asia/Ulan_Bator'
,'Asia/Urumqi'
,'Asia/Ust-Nera'
,'Asia/Vientiane'
,'Asia/Vladivostok'
,'Asia/Yakutsk'
,'Asia/Yangon'
,'Asia/Yekaterinburg'
,'Asia/Yerevan'
,'Atlantic/Azores'
,'Atlantic/Bermuda'
,'Atlantic/Canary'
,'Atlantic/Cape_Verde'
,'Atlantic/Faeroe'
,'Atlantic/Faroe'
,'Atlantic/Jan_Mayen'
,'Atlantic/Madeira'
,'Atlantic/Reykjavik'
,'Atlantic/South_Georgia'
,'Atlantic/St_Helena'
,'Atlantic/Stanley'
,'Australia/ACT'
,'Australia/Adelaide'
,'Australia/Brisbane'
,'Australia/Broken_Hill'
,'Australia/Canberra'
,'Australia/Currie'
,'Australia/Darwin'
,'Australia/Eucla'
,'Australia/Hobart'
,'Australia/LHI'
,'Australia/Lindeman'
,'Australia/Lord_Howe'
,'Australia/Melbourne'
,'Australia/NSW'
,'Australia/North'
,'Australia/Perth'
,'Australia/Queensland'
,'Australia/South'
,'Australia/Sydney'
,'Australia/Tasmania'
,'Australia/Victoria'
,'Australia/West'
,'Australia/Yancowinna'
,'Brazil/Acre'
,'Brazil/DeNoronha'
,'Brazil/East'
,'Brazil/West'
,'CET'
,'CST6CDT'
,'Canada/Atlantic'
,'Canada/Central'
,'Canada/Eastern'
,'Canada/Mountain'
,'Canada/Newfoundland'
,'Canada/Pacific'
,'Canada/Saskatchewan'
,'Canada/Yukon'
,'Chile/Continental'
,'Chile/EasterIsland'
,'Cuba'
,'EET'
,'EST'
,'EST5EDT'
,'Egypt'
,'Eire'
,'Etc/GMT'
,'Etc/GMT+0'
,'Etc/GMT+1'
,'Etc/GMT+10'
,'Etc/GMT+11'
,'Etc/GMT+12'
,'Etc/GMT+2'
,'Etc/GMT+3'
,'Etc/GMT+4'
,'Etc/GMT+5'
,'Etc/GMT+6'
,'Etc/GMT+7'
,'Etc/GMT+8'
,'Etc/GMT+9'
,'Etc/GMT-0'
,'Etc/GMT-1'
,'Etc/GMT-10'
,'Etc/GMT-11'
,'Etc/GMT-12'
,'Etc/GMT-13'
,'Etc/GMT-14'
,'Etc/GMT-2'
,'Etc/GMT-3'
,'Etc/GMT-4'
,'Etc/GMT-5'
,'Etc/GMT-6'
,'Etc/GMT-7'
,'Etc/GMT-8'
,'Etc/GMT-9'
,'Etc/GMT0'
,'Etc/Greenwich'
,'Etc/UCT'
,'Etc/UTC'
,'Etc/Universal'
,'Etc/Zulu'
,'Europe/Amsterdam'
,'Europe/Andorra'
,'Europe/Astrakhan'
,'Europe/Athens'
,'Europe/Belfast'
,'Europe/Belgrade'
,'Europe/Berlin'
,'Europe/Bratislava'
,'Europe/Brussels'
,'Europe/Bucharest'
,'Europe/Budapest'
,'Europe/Busingen'
,'Europe/Chisinau'
,'Europe/Copenhagen'
,'Europe/Dublin'
,'Europe/Gibraltar'
,'Europe/Guernsey'
,'Europe/Helsinki'
,'Europe/Isle_of_Man'
,'Europe/Istanbul'
,'Europe/Jersey'
,'Europe/Kaliningrad'
,'Europe/Kiev'
,'Europe/Kirov'
# -- !! -- ,'Europe/Kyiv'
,'Europe/Lisbon'
,'Europe/Ljubljana'
,'Europe/London'
,'Europe/Luxembourg'
,'Europe/Madrid'
,'Europe/Malta'
,'Europe/Mariehamn'
,'Europe/Minsk'
,'Europe/Monaco'
,'Europe/Moscow'
,'Europe/Nicosia'
,'Europe/Oslo'
,'Europe/Paris'
,'Europe/Podgorica'
,'Europe/Prague'
,'Europe/Riga'
,'Europe/Rome'
,'Europe/Samara'
,'Europe/San_Marino'
,'Europe/Sarajevo'
,'Europe/Saratov'
,'Europe/Simferopol'
,'Europe/Skopje'
,'Europe/Sofia'
,'Europe/Stockholm'
,'Europe/Tallinn'
,'Europe/Tirane'
,'Europe/Tiraspol'
,'Europe/Ulyanovsk'
,'Europe/Uzhgorod'
,'Europe/Vaduz'
,'Europe/Vatican'
,'Europe/Vienna'
,'Europe/Vilnius'
,'Europe/Volgograd'
,'Europe/Warsaw'
,'Europe/Zagreb'
,'Europe/Zaporozhye'
,'Europe/Zurich'
,'Factory'
,'GB'
,'GB-Eire'
,'GMT+0'
,'GMT-0'
,'GMT0'
,'Greenwich'
,'HST'
,'Hongkong'
,'Iceland'
,'Indian/Antananarivo'
,'Indian/Chagos'
,'Indian/Christmas'
,'Indian/Cocos'
,'Indian/Comoro'
,'Indian/Kerguelen'
,'Indian/Mahe'
,'Indian/Maldives'
,'Indian/Mauritius'
,'Indian/Mayotte'
,'Indian/Reunion'
,'Iran'
,'Israel'
,'Jamaica'
,'Japan'
,'Kwajalein'
,'Libya'
,'MET'
,'MST'
,'MST7MDT'
,'Mexico/BajaNorte'
,'Mexico/BajaSur'
,'Mexico/General'
,'NZ'
,'NZ-CHAT'
,'Navajo'
,'PRC'
,'PST8PDT'
,'Pacific/Apia'
,'Pacific/Auckland'
,'Pacific/Bougainville'
,'Pacific/Chatham'
,'Pacific/Chuuk'
,'Pacific/Easter'
,'Pacific/Efate'
,'Pacific/Enderbury'
,'Pacific/Fakaofo'
,'Pacific/Fiji'
,'Pacific/Funafuti'
,'Pacific/Galapagos'
,'Pacific/Gambier'
,'Pacific/Guadalcanal'
,'Pacific/Guam'
,'Pacific/Honolulu'
,'Pacific/Johnston'
# -- !! -- ,'Pacific/Kanton'
,'Pacific/Kiritimati'
,'Pacific/Kosrae'
,'Pacific/Kwajalein'
,'Pacific/Majuro'
,'Pacific/Marquesas'
,'Pacific/Midway'
,'Pacific/Nauru'
,'Pacific/Niue'
,'Pacific/Norfolk'
,'Pacific/Noumea'
,'Pacific/Pago_Pago'
,'Pacific/Palau'
,'Pacific/Pitcairn'
,'Pacific/Pohnpei'
,'Pacific/Ponape'
,'Pacific/Port_Moresby'
,'Pacific/Rarotonga'
,'Pacific/Saipan'
,'Pacific/Samoa'
,'Pacific/Tahiti'
,'Pacific/Tarawa'
,'Pacific/Tongatapu'
,'Pacific/Truk'
,'Pacific/Wake'
,'Pacific/Wallis'
,'Pacific/Yap'
,'Poland'
,'Portugal'
,'ROC'
,'ROK'
,'Singapore'
,'Turkey'
,'UCT'
,'US/Alaska'
,'US/Aleutian'
,'US/Arizona'
,'US/Central'
,'US/East-Indiana'
,'US/Eastern'
,'US/Hawaii'
,'US/Indiana-Starke'
,'US/Michigan'
,'US/Mountain'
,'US/Pacific'
,'US/Samoa'
,'UTC'
,'Universal'
,'W-SU'
,'WET'
,'Zulu'
]
problematic_timezones_map = {}
with act.db.connect() as con:
cur = con.cursor()
# random.choice(fb_time_zones)
for tz_name in fb_time_zones:
try:
tz_info = get_timezone(tz_name)
# print(tz_name)
tm_region = (
datetime.time(11, 22, 33, 561400, get_timezone(tz_name))
,datetime.time(12, 23, 34, 672400, get_timezone(tz_name))
,datetime.time(13, 24, 35, 783400, get_timezone(tz_name))
)
ts_region = (
datetime.datetime(2020, 10, 20, 11, 22, 33, 561400, get_timezone(tz_name))
,datetime.datetime(2021, 11, 21, 12, 23, 34, 672400, get_timezone(tz_name))
,datetime.datetime(2022, 12, 22, 13, 24, 35, 783400, get_timezone(tz_name))
)
#------------------------------------------------
cur.execute("insert into test(arr_tmtz, arr_tstz) values (?, ?) returning arr_tmtz,arr_tstz", ( tm_region, ts_region ) )
inserted_tmtz_array, inserted_tstz_array = cur.fetchone()[:2]
if set(inserted_tmtz_array) == set(tm_region) and set(inserted_tstz_array) == set(ts_region):
pass
else:
print('MISMATCH detected between input data and stored result:')
for i,x in enumerate(inserted_tmtz_array):
print(i, f'Input element (TIME WITH TIME ZONE): {tm_region[i]}', f'; stored data: {x}')
for i,x in enumerate(inserted_tstz_array):
print(i, f'Input element (TIMESTAMP WITH TIME ZONE): {ts_region[i]}', f'; stored data: {x}')
cur.execute("delete from test")
except Exception as e:
problematic_timezones_map[tz_name] = e.__str__()
if problematic_timezones_map:
print('Problems detected with time zone(s):')
for k,v in problematic_timezones_map.items():
print(k,v)
act.stdout = capsys.readouterr().out
assert act.clean_stdout == ''
act.reset()