diff --git a/tests/bugs/gh_6545_test.py b/tests/bugs/gh_6545_test.py new file mode 100644 index 00000000..89bab2b5 --- /dev/null +++ b/tests/bugs/gh_6545_test.py @@ -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()