6
0
mirror of https://github.com/FirebirdSQL/firebird-qa.git synced 2025-01-22 21:43:06 +01:00
firebird-qa/tests/bugs/gh_6545_test.py

690 lines
20 KiB
Python

#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()