diff --git a/src/alice/alice.h b/src/alice/alice.h index f08834bb86..419c4252a9 100644 --- a/src/alice/alice.h +++ b/src/alice/alice.h @@ -73,7 +73,6 @@ enum alice_repl_mode { struct user_action { - ULONG ua_switches; const char* ua_user; const char* ua_role; const char* ua_password; diff --git a/src/alice/aliceswi.h b/src/alice/aliceswi.h index 3702d06e7e..e100fd46e1 100644 --- a/src/alice/aliceswi.h +++ b/src/alice/aliceswi.h @@ -66,6 +66,7 @@ const SINT64 sw_nolinger = QUADCONST(0x0000001000000000); const SINT64 sw_icu = QUADCONST(0x0000002000000000); const SINT64 sw_role = QUADCONST(0x0000004000000000); const SINT64 sw_replica = QUADCONST(0x0000008000000000); +const SINT64 sw_upgrade = QUADCONST(0x0000010000000000); // Popular combination of compatible switches const SINT64 sw_auth_set = sw_user | sw_password | sw_role | sw_fetch_password | sw_trusted_auth; @@ -126,7 +127,8 @@ enum alice_switches IN_SW_ALICE_ICU = 48, IN_SW_ALICE_ROLE = 49, IN_SW_ALICE_REPLICA = 50, - IN_SW_ALICE_PARALLEL_WORKERS = 51 + IN_SW_ALICE_PARALLEL_WORKERS = 51, + IN_SW_ALICE_UPGRADE = 52 }; static const char* const ALICE_SW_ASYNC = "ASYNC"; @@ -259,6 +261,9 @@ static const Switches::in_sw_tab_t alice_in_sw_table[] = 0, (sw_user | sw_password | sw_fetch_password), false, false, 115, 3, NULL}, // msg 115: -trusted use trusted authentication #endif + {IN_SW_ALICE_UPGRADE, isc_spb_rpr_upgrade_db, "UPGRADE", sw_upgrade, + 0, ~(sw_upgrade | sw_user | sw_password | sw_nolinger | sw_role), false, true, 136, 2, NULL}, + // msg 136: \t-upgrade\t\tupgrade database ODS {IN_SW_ALICE_NO_RESERVE, 0, "USE", sw_no_reserve, 0, ~(sw_no_reserve | sw_auth_set | sw_nolinger), false, false, 49, 1, NULL}, // msg 49: \t-use\t\tuse full or reserve space for versions diff --git a/src/alice/exe.cpp b/src/alice/exe.cpp index 5dc13750a4..0d9b9929da 100644 --- a/src/alice/exe.cpp +++ b/src/alice/exe.cpp @@ -335,6 +335,9 @@ static void buildDpb(Firebird::ClumpletWriter& dpb, const SINT64 switches) if (switches & sw_icu) dpb.insertTag(isc_dpb_reset_icu); + if (switches & sw_upgrade) + dpb.insertTag(isc_dpb_upgrade_db); + const unsigned char* authBlock; unsigned int authBlockSize = tdgbl->uSvc->getAuthBlock(&authBlock); diff --git a/src/include/firebird/impl/consts_pub.h b/src/include/firebird/impl/consts_pub.h index 57bd35f5e0..688d952de5 100644 --- a/src/include/firebird/impl/consts_pub.h +++ b/src/include/firebird/impl/consts_pub.h @@ -129,6 +129,7 @@ #define isc_dpb_decfloat_round 94 #define isc_dpb_decfloat_traps 95 #define isc_dpb_clear_map 96 +#define isc_dpb_upgrade_db 97 #define isc_dpb_parallel_workers 100 #define isc_dpb_worker_attach 101 @@ -536,6 +537,7 @@ #define isc_spb_rpr_kill_shadows 0x40 #define isc_spb_rpr_full 0x80 #define isc_spb_rpr_icu 0x0800 +#define isc_spb_rpr_upgrade_db 0x1000 /***************************************** * Parameters for isc_action_svc_restore * diff --git a/src/include/gen/Firebird.pas b/src/include/gen/Firebird.pas index 20edfdc1b3..ded7b8fac4 100644 --- a/src/include/gen/Firebird.pas +++ b/src/include/gen/Firebird.pas @@ -3986,6 +3986,7 @@ const isc_dpb_decfloat_round = byte(94); isc_dpb_decfloat_traps = byte(95); isc_dpb_clear_map = byte(96); + isc_dpb_upgrade_db = byte(97); isc_dpb_parallel_workers = byte(100); isc_dpb_worker_attach = byte(101); isc_dpb_address = byte(1); @@ -4222,6 +4223,7 @@ const isc_spb_rpr_kill_shadows = $40; isc_spb_rpr_full = $80; isc_spb_rpr_icu = $0800; + isc_spb_rpr_upgrade_db = $1000; isc_spb_res_buffers = byte(9); isc_spb_res_page_size = byte(10); isc_spb_res_length = byte(11); diff --git a/src/jrd/fields.h b/src/jrd/fields.h index 16daf6292f..c224a0e941 100644 --- a/src/jrd/fields.h +++ b/src/jrd/fields.h @@ -22,208 +22,208 @@ */ -// type , name , dtype , length , sub_type , dflt_blr , nullable) - FIELD(fld_context , nam_v_context , dtype_short , sizeof(SSHORT) , 0 , NULL , true) - FIELD(fld_ctx_name , nam_context , dtype_text , 255 * METADATA_BYTES_PER_CHAR, dsc_text_type_metadata , NULL , true) - FIELD(fld_description , nam_description , dtype_blob , BLOB_SIZE , isc_blob_text , NULL , true) - FIELD(fld_edit_string , nam_edit_string , dtype_varying , 127 , 0 , NULL , true) - FIELD(fld_f_id , nam_f_id , dtype_short , sizeof(SSHORT) , 0 , NULL , true) - FIELD(fld_f_name , nam_f_name , dtype_text , MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , true) - FIELD(fld_flag , nam_sys_flag , dtype_short , sizeof(SSHORT) , 0 , NULL , false) - FIELD(fld_flag_nullable , nam_sys_nullflag , dtype_short , sizeof(SSHORT) , 0 , NULL , true) - FIELD(fld_i_id , nam_i_id , dtype_short , sizeof(SSHORT) , 0 , NULL , true) - FIELD(fld_i_name , nam_i_name , dtype_text , MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , true) - FIELD(fld_f_length , nam_f_length , dtype_short , sizeof(SSHORT) , 0 , NULL , true) - FIELD(fld_f_position , nam_f_position , dtype_short , sizeof(SSHORT) , 0 , NULL , true) - FIELD(fld_f_scale , nam_f_scale , dtype_short , sizeof(SSHORT) , 0 , NULL , true) - FIELD(fld_f_type , nam_f_type , dtype_short , sizeof(SSHORT) , 0 , NULL , true) - FIELD(fld_format , nam_fmt , dtype_short , sizeof(SSHORT) , 0 , NULL , true) - FIELD(fld_key_length , nam_key_length , dtype_short , sizeof(SSHORT) , 0 , NULL , true) - FIELD(fld_p_number , nam_p_number , dtype_long , sizeof(SLONG) , 0 , NULL , true) - FIELD(fld_p_sequence , nam_p_sequence , dtype_long , sizeof(SLONG) , 0 , NULL , true) - FIELD(fld_p_type , nam_p_type , dtype_short , sizeof(SSHORT) , 0 , NULL , true) - FIELD(fld_q_header , nam_q_header , dtype_blob , BLOB_SIZE , isc_blob_text , NULL , true) - FIELD(fld_r_id , nam_r_id , dtype_short , sizeof(SSHORT) , 0 , NULL , true) - FIELD(fld_r_name , nam_r_name , dtype_text , MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , true) - FIELD(fld_s_count , nam_s_count , dtype_short , sizeof(SSHORT) , 0 , NULL , true) - FIELD(fld_s_length , nam_s_length , dtype_short , sizeof(SSHORT) , 0 , NULL , true) - FIELD(fld_source , nam_source , dtype_blob , BLOB_SIZE , isc_blob_text , NULL , true) - FIELD(fld_sub_type , nam_f_sub_type , dtype_short , sizeof(SSHORT) , 0 , NULL , true) - FIELD(fld_v_blr , nam_v_blr , dtype_blob , BLOB_SIZE , isc_blob_blr , NULL , true) - FIELD(fld_validation , nam_vl_blr , dtype_blob , BLOB_SIZE , isc_blob_blr , NULL , true) - FIELD(fld_value , nam_value , dtype_blob , BLOB_SIZE , isc_blob_blr , NULL , true) - FIELD(fld_class , nam_class , dtype_text , MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , true) - FIELD(fld_acl , nam_acl , dtype_blob , BLOB_SIZE , isc_blob_acl , NULL , true) - FIELD(fld_file_name , nam_file_name , dtype_varying , 255 , 0 , NULL , true) - FIELD(fld_file_name2 , nam_file_name2 , dtype_varying , 255 * METADATA_BYTES_PER_CHAR, dsc_text_type_metadata , NULL , true) - FIELD(fld_file_seq , nam_file_seq , dtype_short , sizeof(SSHORT) , 0 , NULL , true) - FIELD(fld_file_start , nam_file_start , dtype_long , sizeof(SLONG) , 0 , NULL , true) - FIELD(fld_file_length , nam_file_length , dtype_long , sizeof(SLONG) , 0 , NULL , true) - FIELD(fld_file_flags , nam_file_flags , dtype_short , sizeof(SSHORT) , 0 , NULL , true) - FIELD(fld_trigger , nam_trigger , dtype_blob , BLOB_SIZE , isc_blob_blr , NULL , true) +// type , name , dtype , length , sub_type , dflt_blr , nullable , ods) + FIELD(fld_context , nam_v_context , dtype_short , sizeof(SSHORT) , 0 , NULL , true , ODS_13_0) + FIELD(fld_ctx_name , nam_context , dtype_text , 255 * METADATA_BYTES_PER_CHAR, dsc_text_type_metadata , NULL , true , ODS_13_0) + FIELD(fld_description , nam_description , dtype_blob , BLOB_SIZE , isc_blob_text , NULL , true , ODS_13_0) + FIELD(fld_edit_string , nam_edit_string , dtype_varying , 127 , 0 , NULL , true , ODS_13_0) + FIELD(fld_f_id , nam_f_id , dtype_short , sizeof(SSHORT) , 0 , NULL , true , ODS_13_0) + FIELD(fld_f_name , nam_f_name , dtype_text , MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , true , ODS_13_0) + FIELD(fld_flag , nam_sys_flag , dtype_short , sizeof(SSHORT) , 0 , NULL , false , ODS_13_0) + FIELD(fld_flag_nullable , nam_sys_nullflag , dtype_short , sizeof(SSHORT) , 0 , NULL , true , ODS_13_0) + FIELD(fld_i_id , nam_i_id , dtype_short , sizeof(SSHORT) , 0 , NULL , true , ODS_13_0) + FIELD(fld_i_name , nam_i_name , dtype_text , MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , true , ODS_13_0) + FIELD(fld_f_length , nam_f_length , dtype_short , sizeof(SSHORT) , 0 , NULL , true , ODS_13_0) + FIELD(fld_f_position , nam_f_position , dtype_short , sizeof(SSHORT) , 0 , NULL , true , ODS_13_0) + FIELD(fld_f_scale , nam_f_scale , dtype_short , sizeof(SSHORT) , 0 , NULL , true , ODS_13_0) + FIELD(fld_f_type , nam_f_type , dtype_short , sizeof(SSHORT) , 0 , NULL , true , ODS_13_0) + FIELD(fld_format , nam_fmt , dtype_short , sizeof(SSHORT) , 0 , NULL , true , ODS_13_0) + FIELD(fld_key_length , nam_key_length , dtype_short , sizeof(SSHORT) , 0 , NULL , true , ODS_13_0) + FIELD(fld_p_number , nam_p_number , dtype_long , sizeof(SLONG) , 0 , NULL , true , ODS_13_0) + FIELD(fld_p_sequence , nam_p_sequence , dtype_long , sizeof(SLONG) , 0 , NULL , true , ODS_13_0) + FIELD(fld_p_type , nam_p_type , dtype_short , sizeof(SSHORT) , 0 , NULL , true , ODS_13_0) + FIELD(fld_q_header , nam_q_header , dtype_blob , BLOB_SIZE , isc_blob_text , NULL , true , ODS_13_0) + FIELD(fld_r_id , nam_r_id , dtype_short , sizeof(SSHORT) , 0 , NULL , true , ODS_13_0) + FIELD(fld_r_name , nam_r_name , dtype_text , MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , true , ODS_13_0) + FIELD(fld_s_count , nam_s_count , dtype_short , sizeof(SSHORT) , 0 , NULL , true , ODS_13_0) + FIELD(fld_s_length , nam_s_length , dtype_short , sizeof(SSHORT) , 0 , NULL , true , ODS_13_0) + FIELD(fld_source , nam_source , dtype_blob , BLOB_SIZE , isc_blob_text , NULL , true , ODS_13_0) + FIELD(fld_sub_type , nam_f_sub_type , dtype_short , sizeof(SSHORT) , 0 , NULL , true , ODS_13_0) + FIELD(fld_v_blr , nam_v_blr , dtype_blob , BLOB_SIZE , isc_blob_blr , NULL , true , ODS_13_0) + FIELD(fld_validation , nam_vl_blr , dtype_blob , BLOB_SIZE , isc_blob_blr , NULL , true , ODS_13_0) + FIELD(fld_value , nam_value , dtype_blob , BLOB_SIZE , isc_blob_blr , NULL , true , ODS_13_0) + FIELD(fld_class , nam_class , dtype_text , MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , true , ODS_13_0) + FIELD(fld_acl , nam_acl , dtype_blob , BLOB_SIZE , isc_blob_acl , NULL , true , ODS_13_0) + FIELD(fld_file_name , nam_file_name , dtype_varying , 255 , 0 , NULL , true , ODS_13_0) + FIELD(fld_file_name2 , nam_file_name2 , dtype_varying , 255 * METADATA_BYTES_PER_CHAR, dsc_text_type_metadata , NULL , true , ODS_13_0) + FIELD(fld_file_seq , nam_file_seq , dtype_short , sizeof(SSHORT) , 0 , NULL , true , ODS_13_0) + FIELD(fld_file_start , nam_file_start , dtype_long , sizeof(SLONG) , 0 , NULL , true , ODS_13_0) + FIELD(fld_file_length , nam_file_length , dtype_long , sizeof(SLONG) , 0 , NULL , true , ODS_13_0) + FIELD(fld_file_flags , nam_file_flags , dtype_short , sizeof(SSHORT) , 0 , NULL , true , ODS_13_0) + FIELD(fld_trigger , nam_trigger , dtype_blob , BLOB_SIZE , isc_blob_blr , NULL , true , ODS_13_0) - FIELD(fld_trg_name , nam_trg_name , dtype_text , MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , true) - FIELD(fld_gnr_name , nam_gnr_name , dtype_text , MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , true) - FIELD(fld_fun_name , nam_fun_name , dtype_text , MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , true) - FIELD(fld_ext_name , nam_ext_name , dtype_text , 255 , 0 , NULL , true) - FIELD(fld_typ_name , nam_typ_name , dtype_text , MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , true) - FIELD(fld_dimensions , nam_dimensions , dtype_short , sizeof(SSHORT) , 0 , NULL , true) - FIELD(fld_runtime , nam_runtime , dtype_blob , BLOB_SIZE , isc_blob_summary , NULL , true) - FIELD(fld_trg_seq , nam_trg_seq , dtype_short , sizeof(SSHORT) , 0 , NULL , true) - FIELD(fld_gnr_type , nam_gnr_type , dtype_short , sizeof(SSHORT) , 0 , NULL , true) - FIELD(fld_trg_type , nam_trg_type , dtype_int64 , sizeof(SINT64) , 0 , NULL , true) - FIELD(fld_obj_type , nam_obj_type , dtype_short , sizeof(SSHORT) , 0 , NULL , true) - FIELD(fld_mechanism , nam_mechanism , dtype_short , sizeof(SSHORT) , 0 , NULL , true) - FIELD(fld_f_descr , nam_desc , dtype_blob , BLOB_SIZE , isc_blob_format , NULL , true) - FIELD(fld_fun_type , nam_fun_type , dtype_short , sizeof(SSHORT) , 0 , NULL , true) - FIELD(fld_trans_id , nam_trans_id , dtype_int64 , sizeof(SINT64) , 0 , NULL , true) - FIELD(fld_trans_state , nam_trans_state , dtype_short , sizeof(SSHORT) , 0 , NULL , true) - FIELD(fld_time , nam_time , dtype_timestamp, TIMESTAMP_SIZE , 0 , NULL , true) - FIELD(fld_trans_desc , nam_trans_desc , dtype_blob , BLOB_SIZE , isc_blob_tra , NULL , true) - FIELD(fld_msg , nam_msg , dtype_varying , 1023 , 0 , NULL , true) - FIELD(fld_msg_num , nam_msg_num , dtype_short , sizeof(SSHORT) , 0 , NULL , true) - FIELD(fld_user , nam_user , dtype_text , USERNAME_LENGTH , dsc_text_type_metadata , NULL , true) - FIELD(fld_privilege , nam_privilege , dtype_text , 6 , 0 , NULL , true) - FIELD(fld_ext_desc , nam_ext_desc , dtype_blob , BLOB_SIZE , isc_blob_extfile , NULL , true) - FIELD(fld_shad_num , nam_shad_num , dtype_short , sizeof(SSHORT) , 0 , NULL , true) - FIELD(fld_gen_name , nam_gen_name , dtype_text , MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , true) - FIELD(fld_gen_id , nam_gen_id , dtype_short , sizeof(SSHORT) , 0 , NULL , true) - FIELD(fld_bound , nam_bound , dtype_long , sizeof(SLONG) , 0 , NULL , true) - FIELD(fld_dim , nam_dim , dtype_short , sizeof(SSHORT) , 0 , NULL , true) - FIELD(fld_statistics , nam_statistics , dtype_double , sizeof(double) , 0 , NULL , true) - FIELD(fld_null_flag , nam_null_flag , dtype_short , sizeof(SSHORT) , 0 , NULL , true) - FIELD(fld_con_name , nam_con_name , dtype_text , MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , true) - FIELD(fld_con_type , nam_con_type , dtype_text , 11 , 0 , NULL , true) - FIELD(fld_defer , nam_defer , dtype_text , 3 , 0 , dflt_no , true) - FIELD(fld_match , nam_match , dtype_text , 7 , 0 , dflt_full , true) - FIELD(fld_rule , nam_rule , dtype_text , 11 , 0 , dflt_restrict, true) - FIELD(fld_file_partitions, nam_file_partitions, dtype_short , sizeof(SSHORT) , 0 , NULL , true) - FIELD(fld_prc_blr , nam_prc_blr , dtype_blob , BLOB_SIZE , isc_blob_blr , NULL , true) - FIELD(fld_prc_id , nam_prc_id , dtype_short , sizeof(SSHORT) , 0 , NULL , true) - FIELD(fld_prc_prm , nam_prc_prm , dtype_short , sizeof(SSHORT) , 0 , NULL , true) - FIELD(fld_prc_name , nam_prc_name , dtype_text , MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , true) - FIELD(fld_prm_name , nam_prm_name , dtype_text , MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , true) - FIELD(fld_prm_number , nam_prm_number , dtype_short , sizeof(SSHORT) , 0 , NULL , true) - FIELD(fld_prm_type , nam_prm_type , dtype_short , sizeof(SSHORT) , 0 , NULL , true) + FIELD(fld_trg_name , nam_trg_name , dtype_text , MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , true , ODS_13_0) + FIELD(fld_gnr_name , nam_gnr_name , dtype_text , MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , true , ODS_13_0) + FIELD(fld_fun_name , nam_fun_name , dtype_text , MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , true , ODS_13_0) + FIELD(fld_ext_name , nam_ext_name , dtype_text , 255 , 0 , NULL , true , ODS_13_0) + FIELD(fld_typ_name , nam_typ_name , dtype_text , MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , true , ODS_13_0) + FIELD(fld_dimensions , nam_dimensions , dtype_short , sizeof(SSHORT) , 0 , NULL , true , ODS_13_0) + FIELD(fld_runtime , nam_runtime , dtype_blob , BLOB_SIZE , isc_blob_summary , NULL , true , ODS_13_0) + FIELD(fld_trg_seq , nam_trg_seq , dtype_short , sizeof(SSHORT) , 0 , NULL , true , ODS_13_0) + FIELD(fld_gnr_type , nam_gnr_type , dtype_short , sizeof(SSHORT) , 0 , NULL , true , ODS_13_0) + FIELD(fld_trg_type , nam_trg_type , dtype_int64 , sizeof(SINT64) , 0 , NULL , true , ODS_13_0) + FIELD(fld_obj_type , nam_obj_type , dtype_short , sizeof(SSHORT) , 0 , NULL , true , ODS_13_0) + FIELD(fld_mechanism , nam_mechanism , dtype_short , sizeof(SSHORT) , 0 , NULL , true , ODS_13_0) + FIELD(fld_f_descr , nam_desc , dtype_blob , BLOB_SIZE , isc_blob_format , NULL , true , ODS_13_0) + FIELD(fld_fun_type , nam_fun_type , dtype_short , sizeof(SSHORT) , 0 , NULL , true , ODS_13_0) + FIELD(fld_trans_id , nam_trans_id , dtype_int64 , sizeof(SINT64) , 0 , NULL , true , ODS_13_0) + FIELD(fld_trans_state , nam_trans_state , dtype_short , sizeof(SSHORT) , 0 , NULL , true , ODS_13_0) + FIELD(fld_time , nam_time , dtype_timestamp, TIMESTAMP_SIZE , 0 , NULL , true , ODS_13_0) + FIELD(fld_trans_desc , nam_trans_desc , dtype_blob , BLOB_SIZE , isc_blob_tra , NULL , true , ODS_13_0) + FIELD(fld_msg , nam_msg , dtype_varying , 1023 , 0 , NULL , true , ODS_13_0) + FIELD(fld_msg_num , nam_msg_num , dtype_short , sizeof(SSHORT) , 0 , NULL , true , ODS_13_0) + FIELD(fld_user , nam_user , dtype_text , USERNAME_LENGTH , dsc_text_type_metadata , NULL , true , ODS_13_0) + FIELD(fld_privilege , nam_privilege , dtype_text , 6 , 0 , NULL , true , ODS_13_0) + FIELD(fld_ext_desc , nam_ext_desc , dtype_blob , BLOB_SIZE , isc_blob_extfile , NULL , true , ODS_13_0) + FIELD(fld_shad_num , nam_shad_num , dtype_short , sizeof(SSHORT) , 0 , NULL , true , ODS_13_0) + FIELD(fld_gen_name , nam_gen_name , dtype_text , MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , true , ODS_13_0) + FIELD(fld_gen_id , nam_gen_id , dtype_short , sizeof(SSHORT) , 0 , NULL , true , ODS_13_0) + FIELD(fld_bound , nam_bound , dtype_long , sizeof(SLONG) , 0 , NULL , true , ODS_13_0) + FIELD(fld_dim , nam_dim , dtype_short , sizeof(SSHORT) , 0 , NULL , true , ODS_13_0) + FIELD(fld_statistics , nam_statistics , dtype_double , sizeof(double) , 0 , NULL , true , ODS_13_0) + FIELD(fld_null_flag , nam_null_flag , dtype_short , sizeof(SSHORT) , 0 , NULL , true , ODS_13_0) + FIELD(fld_con_name , nam_con_name , dtype_text , MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , true , ODS_13_0) + FIELD(fld_con_type , nam_con_type , dtype_text , 11 , 0 , NULL , true , ODS_13_0) + FIELD(fld_defer , nam_defer , dtype_text , 3 , 0 , dflt_no , true , ODS_13_0) + FIELD(fld_match , nam_match , dtype_text , 7 , 0 , dflt_full , true , ODS_13_0) + FIELD(fld_rule , nam_rule , dtype_text , 11 , 0 , dflt_restrict, true , ODS_13_0) + FIELD(fld_file_partitions, nam_file_partitions, dtype_short , sizeof(SSHORT) , 0 , NULL , true , ODS_13_0) + FIELD(fld_prc_blr , nam_prc_blr , dtype_blob , BLOB_SIZE , isc_blob_blr , NULL , true , ODS_13_0) + FIELD(fld_prc_id , nam_prc_id , dtype_short , sizeof(SSHORT) , 0 , NULL , true , ODS_13_0) + FIELD(fld_prc_prm , nam_prc_prm , dtype_short , sizeof(SSHORT) , 0 , NULL , true , ODS_13_0) + FIELD(fld_prc_name , nam_prc_name , dtype_text , MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , true , ODS_13_0) + FIELD(fld_prm_name , nam_prm_name , dtype_text , MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , true , ODS_13_0) + FIELD(fld_prm_number , nam_prm_number , dtype_short , sizeof(SSHORT) , 0 , NULL , true , ODS_13_0) + FIELD(fld_prm_type , nam_prm_type , dtype_short , sizeof(SSHORT) , 0 , NULL , true , ODS_13_0) - FIELD(fld_charset_name , nam_charset_name , dtype_text , MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , true) - FIELD(fld_charset_id , nam_charset_id , dtype_short , sizeof(SSHORT) , 0 , NULL , true) - FIELD(fld_collate_name , nam_collate_name , dtype_text , MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , true) - FIELD(fld_collate_id , nam_collate_id , dtype_short , sizeof(SSHORT) , 0 , NULL , true) - FIELD(fld_num_chars , nam_num_chars , dtype_long , sizeof(SLONG) , 0 , NULL , true) - FIELD(fld_xcp_name , nam_xcp_name , dtype_text , MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , true) - FIELD(fld_xcp_number , nam_xcp_number , dtype_long , sizeof(SLONG) , 0 , NULL , true) - FIELD(fld_file_p_offset , nam_file_p_offset , dtype_long , sizeof(SLONG) , 0 , NULL , true) - FIELD(fld_f_precision , nam_f_precision , dtype_short , sizeof(SSHORT) , 0 , NULL , true) + FIELD(fld_charset_name , nam_charset_name , dtype_text , MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , true , ODS_13_0) + FIELD(fld_charset_id , nam_charset_id , dtype_short , sizeof(SSHORT) , 0 , NULL , true , ODS_13_0) + FIELD(fld_collate_name , nam_collate_name , dtype_text , MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , true , ODS_13_0) + FIELD(fld_collate_id , nam_collate_id , dtype_short , sizeof(SSHORT) , 0 , NULL , true , ODS_13_0) + FIELD(fld_num_chars , nam_num_chars , dtype_long , sizeof(SLONG) , 0 , NULL , true , ODS_13_0) + FIELD(fld_xcp_name , nam_xcp_name , dtype_text , MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , true , ODS_13_0) + FIELD(fld_xcp_number , nam_xcp_number , dtype_long , sizeof(SLONG) , 0 , NULL , true , ODS_13_0) + FIELD(fld_file_p_offset , nam_file_p_offset , dtype_long , sizeof(SLONG) , 0 , NULL , true , ODS_13_0) + FIELD(fld_f_precision , nam_f_precision , dtype_short , sizeof(SSHORT) , 0 , NULL , true , ODS_13_0) - FIELD(fld_backup_id , nam_backup_id , dtype_long , sizeof(SLONG) , 0 , NULL , true) - FIELD(fld_backup_level , nam_backup_level , dtype_long , sizeof(SLONG) , 0 , NULL , true) - FIELD(fld_guid , nam_guid , dtype_text , 38 , 0 , NULL , true) - FIELD(fld_scn , nam_scn , dtype_long , sizeof(SLONG) , 0 , NULL , true) + FIELD(fld_backup_id , nam_backup_id , dtype_long , sizeof(SLONG) , 0 , NULL , true , ODS_13_0) + FIELD(fld_backup_level , nam_backup_level , dtype_long , sizeof(SLONG) , 0 , NULL , true , ODS_13_0) + FIELD(fld_guid , nam_guid , dtype_text , 38 , 0 , NULL , true , ODS_13_0) + FIELD(fld_scn , nam_scn , dtype_long , sizeof(SLONG) , 0 , NULL , true , ODS_13_0) - FIELD(fld_specific_attr , nam_specific_attr , dtype_blob , BLOB_SIZE , isc_blob_text , NULL , true) - FIELD(fld_plugin_name , nam_plugin , dtype_text , MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , true) + FIELD(fld_specific_attr , nam_specific_attr , dtype_blob , BLOB_SIZE , isc_blob_text , NULL , true , ODS_13_0) + FIELD(fld_plugin_name , nam_plugin , dtype_text , MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , true , ODS_13_0) - FIELD(fld_r_type , nam_r_type , dtype_short , sizeof(SSHORT) , 0 , NULL , true) - FIELD(fld_prc_type , nam_prc_type , dtype_short , sizeof(SSHORT) , 0 , NULL , true) + FIELD(fld_r_type , nam_r_type , dtype_short , sizeof(SSHORT) , 0 , NULL , true , ODS_13_0) + FIELD(fld_prc_type , nam_prc_type , dtype_short , sizeof(SSHORT) , 0 , NULL , true , ODS_13_0) - FIELD(fld_att_id , nam_att_id , dtype_int64 , sizeof(SINT64) , 0 , NULL , true) - FIELD(fld_stmt_id , nam_stmt_id , dtype_int64 , sizeof(SINT64) , 0 , NULL , true) - FIELD(fld_call_id , nam_call_id , dtype_int64 , sizeof(SINT64) , 0 , NULL , true) - FIELD(fld_stat_id , nam_stat_id , dtype_long , sizeof(SLONG) , 0 , NULL , true) + FIELD(fld_att_id , nam_att_id , dtype_int64 , sizeof(SINT64) , 0 , NULL , true , ODS_13_0) + FIELD(fld_stmt_id , nam_stmt_id , dtype_int64 , sizeof(SINT64) , 0 , NULL , true , ODS_13_0) + FIELD(fld_call_id , nam_call_id , dtype_int64 , sizeof(SINT64) , 0 , NULL , true , ODS_13_0) + FIELD(fld_stat_id , nam_stat_id , dtype_long , sizeof(SLONG) , 0 , NULL , true , ODS_13_0) - FIELD(fld_pid , nam_pid , dtype_long , sizeof(SLONG) , 0 , NULL , true) - FIELD(fld_state , nam_state , dtype_short , sizeof(SSHORT) , 0 , NULL , true) - FIELD(fld_ods_number , nam_ods_number , dtype_short , sizeof(SSHORT) , 0 , NULL , true) - FIELD(fld_page_size , nam_page_size , dtype_long , sizeof(SLONG) , 0 , NULL , true) - FIELD(fld_page_bufs , nam_page_bufs , dtype_long , sizeof(SLONG) , 0 , NULL , true) - FIELD(fld_shut_mode , nam_shut_mode , dtype_short , sizeof(SSHORT) , 0 , NULL , true) - FIELD(fld_sql_dialect , nam_sql_dialect , dtype_short , sizeof(SSHORT) , 0 , NULL , true) - FIELD(fld_sweep_int , nam_sweep_int , dtype_long , sizeof(SLONG) , 0 , NULL , true) - FIELD(fld_counter , nam_counter , dtype_int64 , sizeof(SINT64) , 0 , NULL , true) + FIELD(fld_pid , nam_pid , dtype_long , sizeof(SLONG) , 0 , NULL , true , ODS_13_0) + FIELD(fld_state , nam_state , dtype_short , sizeof(SSHORT) , 0 , NULL , true , ODS_13_0) + FIELD(fld_ods_number , nam_ods_number , dtype_short , sizeof(SSHORT) , 0 , NULL , true , ODS_13_0) + FIELD(fld_page_size , nam_page_size , dtype_long , sizeof(SLONG) , 0 , NULL , true , ODS_13_0) + FIELD(fld_page_bufs , nam_page_bufs , dtype_long , sizeof(SLONG) , 0 , NULL , true , ODS_13_0) + FIELD(fld_shut_mode , nam_shut_mode , dtype_short , sizeof(SSHORT) , 0 , NULL , true , ODS_13_0) + FIELD(fld_sql_dialect , nam_sql_dialect , dtype_short , sizeof(SSHORT) , 0 , NULL , true , ODS_13_0) + FIELD(fld_sweep_int , nam_sweep_int , dtype_long , sizeof(SLONG) , 0 , NULL , true , ODS_13_0) + FIELD(fld_counter , nam_counter , dtype_int64 , sizeof(SINT64) , 0 , NULL , true , ODS_13_0) - FIELD(fld_remote_proto , nam_remote_proto , dtype_varying , 10 , dsc_text_type_ascii , NULL , true) - FIELD(fld_remote_addr , nam_remote_addr , dtype_varying , 255 , dsc_text_type_ascii , NULL , true) + FIELD(fld_remote_proto , nam_remote_proto , dtype_varying , 10 , dsc_text_type_ascii , NULL , true , ODS_13_0) + FIELD(fld_remote_addr , nam_remote_addr , dtype_varying , 255 , dsc_text_type_ascii , NULL , true , ODS_13_0) - FIELD(fld_iso_mode , nam_iso_mode , dtype_short , sizeof(SSHORT) , 0 , NULL , true) - FIELD(fld_lock_timeout , nam_lock_timeout , dtype_short , sizeof(SSHORT) , 0 , NULL , true) - FIELD(fld_backup_state , nam_backup_state , dtype_short , sizeof(SSHORT) , 0 , NULL , true) - FIELD(fld_stat_group , nam_stat_group , dtype_short , sizeof(SSHORT) , 0 , NULL , true) + FIELD(fld_iso_mode , nam_iso_mode , dtype_short , sizeof(SSHORT) , 0 , NULL , true , ODS_13_0) + FIELD(fld_lock_timeout , nam_lock_timeout , dtype_short , sizeof(SSHORT) , 0 , NULL , true , ODS_13_0) + FIELD(fld_backup_state , nam_backup_state , dtype_short , sizeof(SSHORT) , 0 , NULL , true , ODS_13_0) + FIELD(fld_stat_group , nam_stat_group , dtype_short , sizeof(SSHORT) , 0 , NULL , true , ODS_13_0) - FIELD(fld_debug_info , nam_debug_info , dtype_blob , BLOB_SIZE , isc_blob_debug_info , NULL , true) - FIELD(fld_prm_mechanism , nam_prm_mechanism , dtype_short , sizeof(SSHORT) , 0 , NULL , true) - FIELD(fld_src_info , nam_src_info , dtype_long , sizeof(SLONG) , 0 , NULL , true) + FIELD(fld_debug_info , nam_debug_info , dtype_blob , BLOB_SIZE , isc_blob_debug_info , NULL , true , ODS_13_0) + FIELD(fld_prm_mechanism , nam_prm_mechanism , dtype_short , sizeof(SSHORT) , 0 , NULL , true , ODS_13_0) + FIELD(fld_src_info , nam_src_info , dtype_long , sizeof(SLONG) , 0 , NULL , true , ODS_13_0) - FIELD(fld_ctx_var_name , nam_ctx_var_name , dtype_varying , 80 , 0 , NULL , true) - FIELD(fld_ctx_var_value , nam_ctx_var_value , dtype_varying , MAX_VARY_COLUMN_SIZE , 0 , NULL , true) + FIELD(fld_ctx_var_name , nam_ctx_var_name , dtype_varying , 80 , 0 , NULL , true , ODS_13_0) + FIELD(fld_ctx_var_value , nam_ctx_var_value , dtype_varying , MAX_VARY_COLUMN_SIZE , 0 , NULL , true , ODS_13_0) - FIELD(fld_engine_name , nam_engine_name , dtype_text , MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , true) + FIELD(fld_engine_name , nam_engine_name , dtype_text , MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , true , ODS_13_0) - FIELD(fld_pkg_name , nam_pkg_name , dtype_text , MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , true) + FIELD(fld_pkg_name , nam_pkg_name , dtype_text , MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , true , ODS_13_0) - FIELD(fld_fun_id , nam_fun_id , dtype_short , sizeof(SSHORT) , 0 , NULL , true) - FIELD(fld_fun_blr , nam_fun_blr , dtype_blob , BLOB_SIZE , isc_blob_blr , NULL , true) - FIELD(fld_arg_name , nam_arg_name , dtype_text , MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , true) - FIELD(fld_arg_mechanism , nam_arg_mechanism , dtype_short , sizeof(SSHORT) , 0 , NULL , true) + FIELD(fld_fun_id , nam_fun_id , dtype_short , sizeof(SSHORT) , 0 , NULL , true , ODS_13_0) + FIELD(fld_fun_blr , nam_fun_blr , dtype_blob , BLOB_SIZE , isc_blob_blr , NULL , true , ODS_13_0) + FIELD(fld_arg_name , nam_arg_name , dtype_text , MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , true , ODS_13_0) + FIELD(fld_arg_mechanism , nam_arg_mechanism , dtype_short , sizeof(SSHORT) , 0 , NULL , true , ODS_13_0) - FIELD(fld_identity_type , nam_identity_type , dtype_short , sizeof(SSHORT) , 0 , NULL , true) - FIELD(fld_bool , nam_bool , dtype_boolean , 1 , 0 , NULL , true) + FIELD(fld_identity_type , nam_identity_type , dtype_short , sizeof(SSHORT) , 0 , NULL , true , ODS_13_0) + FIELD(fld_bool , nam_bool , dtype_boolean , 1 , 0 , NULL , true , ODS_13_0) - FIELD(fld_user_name , nam_user_name , dtype_varying , MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , true) - FIELD(fld_attr_key , nam_sec_attr_key , dtype_varying , MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , true) - FIELD(fld_attr_value , nam_sec_attr_value, dtype_varying , 255 * METADATA_BYTES_PER_CHAR, dsc_text_type_metadata , NULL , true) - FIELD(fld_name_part , nam_name_part , dtype_varying , 32 * METADATA_BYTES_PER_CHAR, dsc_text_type_metadata , NULL , true) - FIELD(fld_client_ver , nam_client_ver , dtype_varying , 255 , dsc_text_type_ascii , NULL , true) - FIELD(fld_remote_ver , nam_remote_ver , dtype_varying , 255 , dsc_text_type_ascii , NULL , true) - FIELD(fld_host_name , nam_host_name , dtype_varying , 255 * METADATA_BYTES_PER_CHAR, dsc_text_type_metadata , NULL , true) - FIELD(fld_os_user , nam_os_user , dtype_varying , 255 * METADATA_BYTES_PER_CHAR, dsc_text_type_metadata , NULL , true) - FIELD(fld_gen_val , nam_gen_val , dtype_int64 , sizeof(SINT64) , 0 , NULL , true) - FIELD(fld_auth_method , nam_auth_method , dtype_varying , 255 , dsc_text_type_ascii , NULL , true) + FIELD(fld_user_name , nam_user_name , dtype_varying , MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , true , ODS_13_0) + FIELD(fld_attr_key , nam_sec_attr_key , dtype_varying , MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , true , ODS_13_0) + FIELD(fld_attr_value , nam_sec_attr_value, dtype_varying , 255 * METADATA_BYTES_PER_CHAR, dsc_text_type_metadata , NULL , true , ODS_13_0) + FIELD(fld_name_part , nam_name_part , dtype_varying , 32 * METADATA_BYTES_PER_CHAR, dsc_text_type_metadata , NULL , true , ODS_13_0) + FIELD(fld_client_ver , nam_client_ver , dtype_varying , 255 , dsc_text_type_ascii , NULL , true , ODS_13_0) + FIELD(fld_remote_ver , nam_remote_ver , dtype_varying , 255 , dsc_text_type_ascii , NULL , true , ODS_13_0) + FIELD(fld_host_name , nam_host_name , dtype_varying , 255 * METADATA_BYTES_PER_CHAR, dsc_text_type_metadata , NULL , true , ODS_13_0) + FIELD(fld_os_user , nam_os_user , dtype_varying , 255 * METADATA_BYTES_PER_CHAR, dsc_text_type_metadata , NULL , true , ODS_13_0) + FIELD(fld_gen_val , nam_gen_val , dtype_int64 , sizeof(SINT64) , 0 , NULL , true , ODS_13_0) + FIELD(fld_auth_method , nam_auth_method , dtype_varying , 255 , dsc_text_type_ascii , NULL , true , ODS_13_0) - FIELD(fld_linger , nam_linger , dtype_long , sizeof(SLONG) , 0 , NULL , true) - FIELD(fld_sec_db , nam_mon_secdb , dtype_text , 7 , dsc_text_type_ascii , NULL , false) + FIELD(fld_linger , nam_linger , dtype_long , sizeof(SLONG) , 0 , NULL , true , ODS_13_0) + FIELD(fld_sec_db , nam_mon_secdb , dtype_text , 7 , dsc_text_type_ascii , NULL , false , ODS_13_0) - FIELD(fld_map_name , nam_map_name , dtype_text , MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , false) - FIELD(fld_map_using , nam_map_using , dtype_text , 1 * METADATA_BYTES_PER_CHAR, dsc_text_type_metadata , NULL , false) - FIELD(fld_map_db , nam_map_db , dtype_text , MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , true) - FIELD(fld_map_from_type , nam_map_from_type , dtype_text , MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , false) - FIELD(fld_map_from , nam_map_from , dtype_text , 255 * METADATA_BYTES_PER_CHAR, dsc_text_type_metadata , NULL , true) - FIELD(fld_map_to , nam_map_to , dtype_text , MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , true) + FIELD(fld_map_name , nam_map_name , dtype_text , MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , false , ODS_13_0) + FIELD(fld_map_using , nam_map_using , dtype_text , 1 * METADATA_BYTES_PER_CHAR, dsc_text_type_metadata , NULL , false , ODS_13_0) + FIELD(fld_map_db , nam_map_db , dtype_text , MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , true , ODS_13_0) + FIELD(fld_map_from_type , nam_map_from_type , dtype_text , MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , false , ODS_13_0) + FIELD(fld_map_from , nam_map_from , dtype_text , 255 * METADATA_BYTES_PER_CHAR, dsc_text_type_metadata , NULL , true , ODS_13_0) + FIELD(fld_map_to , nam_map_to , dtype_text , MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , true , ODS_13_0) - FIELD(fld_gen_increment , nam_gen_increment , dtype_long , sizeof(SLONG) , 0 , NULL , false) - FIELD(fld_plan , nam_plan , dtype_blob , BLOB_SIZE , isc_blob_text , NULL , true) + FIELD(fld_gen_increment , nam_gen_increment , dtype_long , sizeof(SLONG) , 0 , NULL , false , ODS_13_0) + FIELD(fld_plan , nam_plan , dtype_blob , BLOB_SIZE , isc_blob_text , NULL , true , ODS_13_0) - FIELD(fld_system_privileges, nam_system_privileges, dtype_text, 8 , dsc_text_type_fixed , dflt_no_privs, true) - FIELD(fld_b_sql_security, nam_sql_security , dtype_boolean , 1 , 0 , NULL , true) + FIELD(fld_system_privileges, nam_system_privileges, dtype_text, 8 , dsc_text_type_fixed , dflt_no_privs, true , ODS_13_0) + FIELD(fld_b_sql_security, nam_sql_security , dtype_boolean , 1 , 0 , NULL , true , ODS_13_0) - FIELD(fld_idle_timeout , nam_idle_timeout , dtype_long , sizeof(SLONG) , 0 , NULL , false) - FIELD(fld_idle_timer , nam_idle_timer , dtype_timestamp_tz, TIMESTAMP_TZ_SIZE , 0 , NULL , true) - FIELD(fld_stmt_timeout , nam_stmt_timeout , dtype_long , sizeof(SLONG) , 0 , NULL , false) - FIELD(fld_stmt_timer , nam_stmt_timer , dtype_timestamp_tz, TIMESTAMP_TZ_SIZE , 0 , NULL , true) + FIELD(fld_idle_timeout , nam_idle_timeout , dtype_long , sizeof(SLONG) , 0 , NULL , false , ODS_13_0) + FIELD(fld_idle_timer , nam_idle_timer , dtype_timestamp_tz, TIMESTAMP_TZ_SIZE , 0 , NULL , true , ODS_13_0) + FIELD(fld_stmt_timeout , nam_stmt_timeout , dtype_long , sizeof(SLONG) , 0 , NULL , false , ODS_13_0) + FIELD(fld_stmt_timer , nam_stmt_timer , dtype_timestamp_tz, TIMESTAMP_TZ_SIZE , 0 , NULL , true , ODS_13_0) - FIELD(fld_tz_id , nam_tz_id , dtype_long , sizeof(SLONG) , 0 , NULL , true) - FIELD(fld_tz_name , nam_tz_name , dtype_text , MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , true) - FIELD(fld_tz_offset , nam_tz_offset , dtype_short , sizeof(SSHORT) , 0 , NULL , true) - FIELD(fld_timestamp_tz , nam_timestamp_tz , dtype_timestamp_tz, TIMESTAMP_TZ_SIZE , 0 , NULL , true) + FIELD(fld_tz_id , nam_tz_id , dtype_long , sizeof(SLONG) , 0 , NULL , true , ODS_13_0) + FIELD(fld_tz_name , nam_tz_name , dtype_text , MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , true , ODS_13_0) + FIELD(fld_tz_offset , nam_tz_offset , dtype_short , sizeof(SSHORT) , 0 , NULL , true , ODS_13_0) + FIELD(fld_timestamp_tz , nam_timestamp_tz , dtype_timestamp_tz, TIMESTAMP_TZ_SIZE , 0 , NULL , true , ODS_13_0) - FIELD(fld_tz_db_version , nam_tz_db_version , dtype_varying , 10 , dsc_text_type_ascii , NULL , true) + FIELD(fld_tz_db_version , nam_tz_db_version , dtype_varying , 10 , dsc_text_type_ascii , NULL , true , ODS_13_0) - FIELD(fld_crypt_state , nam_crypt_state , dtype_short , sizeof(SSHORT) , 0 , NULL , true) - FIELD(fld_remote_crypt , nam_wire_crypt_plugin, dtype_varying, MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , true) + FIELD(fld_crypt_state , nam_crypt_state , dtype_short , sizeof(SSHORT) , 0 , NULL , true , ODS_13_0) + FIELD(fld_remote_crypt , nam_wire_crypt_plugin, dtype_varying, MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , true , ODS_13_0) - FIELD(fld_pub_name , nam_pub_name , dtype_text , MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , false) - FIELD(fld_file_id , nam_file_id , dtype_varying , 255 , dsc_text_type_ascii , NULL , false) + FIELD(fld_pub_name , nam_pub_name , dtype_text , MAX_SQL_IDENTIFIER_LEN , dsc_text_type_metadata , NULL , false , ODS_13_0) + FIELD(fld_file_id , nam_file_id , dtype_varying , 255 , dsc_text_type_ascii , NULL , false , ODS_13_0) - FIELD(fld_cfg_id , nam_cfg_id , dtype_long , sizeof(SLONG) , 0 , NULL , false) - FIELD(fld_cfg_name , nam_cfg_name , dtype_varying , MAX_CONFIG_NAME_LEN , dsc_text_type_ascii , NULL , false) - FIELD(fld_cfg_value , nam_cfg_value , dtype_varying , 255 * METADATA_BYTES_PER_CHAR, dsc_text_type_metadata , NULL , true) - FIELD(fld_cfg_is_set , nam_cfg_is_set , dtype_boolean , 1 , 0 , NULL , false) + FIELD(fld_cfg_id , nam_cfg_id , dtype_long , sizeof(SLONG) , 0 , NULL , false , ODS_13_0) + FIELD(fld_cfg_name , nam_cfg_name , dtype_varying , MAX_CONFIG_NAME_LEN , dsc_text_type_ascii , NULL , false , ODS_13_0) + FIELD(fld_cfg_value , nam_cfg_value , dtype_varying , 255 * METADATA_BYTES_PER_CHAR, dsc_text_type_metadata , NULL , true , ODS_13_0) + FIELD(fld_cfg_is_set , nam_cfg_is_set , dtype_boolean , 1 , 0 , NULL , false , ODS_13_0) - FIELD(fld_repl_mode , nam_repl_mode , dtype_short , sizeof(SSHORT) , 0 , NULL , true) + FIELD(fld_repl_mode , nam_repl_mode , dtype_short , sizeof(SSHORT) , 0 , NULL , true , ODS_13_0) - FIELD(fld_keyword_name , nam_keyword_name , dtype_varying , METADATA_IDENTIFIER_CHAR_LEN, dsc_text_type_ascii , NULL , false) - FIELD(fld_keyword_reserved, nam_keyword_reserved, dtype_boolean, 1 , 0 , NULL , false) + FIELD(fld_keyword_name , nam_keyword_name , dtype_varying , METADATA_IDENTIFIER_CHAR_LEN, dsc_text_type_ascii , NULL , false , ODS_13_1) + FIELD(fld_keyword_reserved, nam_keyword_reserved, dtype_boolean, 1 , 0 , NULL , false , ODS_13_1) - FIELD(fld_short_description, nam_short_description, dtype_varying, 255 * METADATA_BYTES_PER_CHAR, dsc_text_type_metadata, NULL , true) - FIELD(fld_seconds_interval, nam_seconds_interval, dtype_long, sizeof(SLONG) , 0 , NULL , true) - FIELD(fld_prof_ses_id , nam_prof_ses_id , dtype_int64 , sizeof(SINT64) , 0 , NULL , true) + FIELD(fld_short_description, nam_short_description, dtype_varying, 255 * METADATA_BYTES_PER_CHAR, dsc_text_type_metadata, NULL , true , ODS_13_1) + FIELD(fld_seconds_interval, nam_seconds_interval, dtype_long, sizeof(SLONG) , 0 , NULL , true , ODS_13_1) + FIELD(fld_prof_ses_id , nam_prof_ses_id , dtype_int64 , sizeof(SINT64) , 0 , NULL , true , ODS_13_1) diff --git a/src/jrd/idx.h b/src/jrd/idx.h index 7960bd7e33..9461e02499 100644 --- a/src/jrd/idx.h +++ b/src/jrd/idx.h @@ -38,6 +38,7 @@ struct ini_idx_t UCHAR ini_idx_relid; UCHAR ini_idx_flags; UCHAR ini_idx_segment_count; + USHORT ini_idx_ods; struct ini_idx_segment_t { UCHAR ini_idx_rfld_id; @@ -54,254 +55,254 @@ using Jrd::idx_string; using Jrd::idx_descending; using Jrd::idx_timestamp_tz; -#define INDEX(id, rel, unique, count) {(id), (UCHAR) (rel), (unique), (count), { +#define INDEX(id, rel, unique, count, ods) {(id), (UCHAR) (rel), (unique), (count), (ods), { #define SEGMENT(fld, type) {(fld), (type)} static const struct ini_idx_t indices[] = { // define index RDB$INDEX_0 for RDB$RELATIONS unique RDB$RELATION_NAME; - INDEX(0, rel_relations, idx_unique, 1) + INDEX(0, rel_relations, idx_unique, 1, ODS_13_0) SEGMENT(f_rel_name, idx_metadata) // relation name }}, // define index RDB$INDEX_1 for RDB$RELATIONS RDB$RELATION_ID; - INDEX(1, rel_relations, 0, 1) + INDEX(1, rel_relations, 0, 1, ODS_13_0) SEGMENT(f_rel_id, idx_numeric) // relation id }}, // define index RDB$INDEX_2 for RDB$FIELDS unique RDB$FIELD_NAME; - INDEX(2, rel_fields, idx_unique, 1) + INDEX(2, rel_fields, idx_unique, 1, ODS_13_0) SEGMENT(f_fld_name, idx_metadata) // field name }}, // define index RDB$INDEX_3 for RDB$RELATION_FIELDS RDB$FIELD_SOURCE; - INDEX(3, rel_rfr, 0, 1) + INDEX(3, rel_rfr, 0, 1, ODS_13_0) SEGMENT(f_rfr_sname, idx_metadata) // field source name }}, // define index RDB$INDEX_4 for RDB$RELATION_FIELDS RDB$RELATION_NAME; - INDEX(4, rel_rfr, 0, 1) + INDEX(4, rel_rfr, 0, 1, ODS_13_0) SEGMENT(f_rfr_rname, idx_metadata) // relation name in RFR }}, // define index RDB$INDEX_5 for RDB$INDICES unique RDB$INDEX_NAME; - INDEX(5, rel_indices, idx_unique, 1) + INDEX(5, rel_indices, idx_unique, 1, ODS_13_0) SEGMENT(f_idx_name, idx_metadata) // index name }}, // define index RDB$INDEX_6 for RDB$INDEX_SEGMENTS RDB$INDEX_NAME; - INDEX(6, rel_segments, 0, 1) + INDEX(6, rel_segments, 0, 1, ODS_13_0) SEGMENT(f_seg_name, idx_metadata) // index name in seg }}, // define index RDB$INDEX_7 for RDB$SECURITY_CLASSES unique RDB$SECURITY_CLASS; - INDEX(7, rel_classes, idx_unique, 1) + INDEX(7, rel_classes, idx_unique, 1, ODS_13_0) SEGMENT(f_cls_class, idx_metadata) // security class }}, // define index RDB$INDEX_8 for RDB$TRIGGERS unique RDB$TRIGGER_NAME; - INDEX(8, rel_triggers, idx_unique, 1) + INDEX(8, rel_triggers, idx_unique, 1, ODS_13_0) SEGMENT(f_trg_name, idx_metadata) // trigger name }}, // define index RDB$INDEX_9 for RDB$FUNCTIONS unique RDB$PACKAGE_NAME, RDB$FUNCTION_NAME; - INDEX(9, rel_funs, idx_unique, 2) + INDEX(9, rel_funs, idx_unique, 2, ODS_13_0) SEGMENT(f_fun_pkg_name, idx_metadata), // package name SEGMENT(f_fun_name, idx_metadata) // function name }}, // define index RDB$INDEX_10 for RDB$FUNCTION_ARGUMENTS RDB$PACKAGE_NAME, RDB$FUNCTION_NAME; - INDEX(10, rel_args, 0, 2) + INDEX(10, rel_args, 0, 2, ODS_13_0) SEGMENT(f_arg_pkg_name, idx_metadata), // package name SEGMENT(f_arg_fun_name, idx_metadata) // function name }}, // define index RDB$INDEX_11 for RDB$GENERATORS unique RDB$GENERATOR_NAME; - INDEX(11, rel_gens, idx_unique, 1) + INDEX(11, rel_gens, idx_unique, 1, ODS_13_0) SEGMENT(f_gen_name, idx_metadata) // Generator name }}, // define index RDB$INDEX_12 for RDB$RELATION_CONSTRAINTS unique RDB$CONSTRAINT_NAME; - INDEX(12, rel_rcon, idx_unique, 1) + INDEX(12, rel_rcon, idx_unique, 1, ODS_13_0) SEGMENT(f_rcon_cname, idx_metadata) // constraint name }}, // define index RDB$INDEX_13 for RDB$REF_CONSTRAINTS unique RDB$CONSTRAINT_NAME; - INDEX(13, rel_refc, idx_unique, 1) + INDEX(13, rel_refc, idx_unique, 1, ODS_13_0) SEGMENT(f_refc_cname, idx_metadata) // constraint name }}, // define index RDB$INDEX_14 for RDB$CHECK_CONSTRAINTS RDB$CONSTRAINT_NAME; - INDEX(14, rel_ccon, 0, 1) + INDEX(14, rel_ccon, 0, 1, ODS_13_0) SEGMENT(f_ccon_cname, idx_metadata) // constraint name }}, // define index RDB$INDEX_15 for RDB$RELATION_FIELDS unique RDB$FIELD_NAME, RDB$RELATION_NAME; - INDEX(15, rel_rfr, idx_unique, 2) + INDEX(15, rel_rfr, idx_unique, 2, ODS_13_0) SEGMENT(f_rfr_fname, idx_metadata), // field name SEGMENT(f_rfr_rname, idx_metadata) // relation name }}, // define index RDB$INDEX_16 for RDB$FORMATS RDB$RELATION_ID, RDB$FORMAT; - INDEX(16, rel_formats, 0, 2) + INDEX(16, rel_formats, 0, 2, ODS_13_0) SEGMENT(f_fmt_rid, idx_numeric), // relation id SEGMENT(f_fmt_format, idx_numeric) // format id }}, // define index RDB$INDEX_17 for RDB$FILTERS RDB$INPUT_SUB_TYPE, RDB$OUTPUT_SUB_TYPE; - INDEX(17, rel_filters, idx_unique, 2) + INDEX(17, rel_filters, idx_unique, 2, ODS_13_0) SEGMENT(f_flt_input, idx_numeric), // input subtype SEGMENT(f_flt_output, idx_numeric) // output subtype }}, // define index RDB$INDEX_18 for RDB$PROCEDURE_PARAMETERS unique RDB$PACKAGE_NAME, // RDB$PROCEDURE_NAME, RDB$PARAMETER_NAME; - INDEX(18, rel_prc_prms, idx_unique, 3) + INDEX(18, rel_prc_prms, idx_unique, 3, ODS_13_0) SEGMENT(f_prm_pkg_name, idx_metadata), // package name SEGMENT(f_prm_procedure, idx_metadata), // procedure name SEGMENT(f_prm_name, idx_metadata) // parameter name }}, // define index RDB$INDEX_19 for RDB$CHARACTER_SETS unique RDB$CHARACTER_SET_NAME; - INDEX(19, rel_charsets, idx_unique, 1) + INDEX(19, rel_charsets, idx_unique, 1, ODS_13_0) SEGMENT(f_cs_cs_name, idx_metadata) // character set name }}, // define index RDB$INDEX_20 for RDB$COLLATIONS unique RDB$COLLATION_NAME; - INDEX(20, rel_collations, idx_unique, 1) + INDEX(20, rel_collations, idx_unique, 1, ODS_13_0) SEGMENT(f_coll_name, idx_metadata) // collation name }}, // define index RDB$INDEX_21 for RDB$PROCEDURES unique RDB$PACKAGE_NAME, RDB$PROCEDURE_NAME; - INDEX(21, rel_procedures, idx_unique, 2) + INDEX(21, rel_procedures, idx_unique, 2, ODS_13_0) SEGMENT(f_prc_pkg_name, idx_metadata), // package name SEGMENT(f_prc_name, idx_metadata) // procedure name }}, // define index RDB$INDEX_22 for RDB$PROCEDURES unique RDB$PROCEDURE_ID; - INDEX(22, rel_procedures, idx_unique, 1) + INDEX(22, rel_procedures, idx_unique, 1, ODS_13_0) SEGMENT(f_prc_id, idx_numeric) // procedure id }}, // define index RDB$INDEX_23 for RDB$EXCEPTIONS unique RDB$EXCEPTION_NAME; - INDEX(23, rel_exceptions, idx_unique, 1) + INDEX(23, rel_exceptions, idx_unique, 1, ODS_13_0) SEGMENT(f_xcp_name, idx_metadata) // exception name }}, // define index RDB$INDEX_24 for RDB$EXCEPTIONS unique RDB$EXCEPTION_NUMBER; - INDEX(24, rel_exceptions, idx_unique, 1) + INDEX(24, rel_exceptions, idx_unique, 1, ODS_13_0) SEGMENT(f_xcp_number, idx_numeric) // exception number }}, // define index RDB$INDEX_25 for RDB$CHARACTER_SETS unique RDB$CHARACTER_SET_ID; - INDEX(25, rel_charsets, idx_unique, 1) + INDEX(25, rel_charsets, idx_unique, 1, ODS_13_0) SEGMENT(f_cs_id, idx_numeric) // character set id }}, // define index RDB$INDEX_26 for RDB$COLLATIONS unique RDB$COLLATION_ID, RDB$CHARACTER_SET_ID; - INDEX(26, rel_collations, idx_unique, 2) + INDEX(26, rel_collations, idx_unique, 2, ODS_13_0) SEGMENT(f_coll_id, idx_numeric), // collation id SEGMENT(f_coll_cs_id, idx_numeric) // character set id }}, // define index RDB$INDEX_27 for RDB$DEPENDENCIES RDB$DEPENDENT_NAME, RDB$DEPENDENT_TYPE; - INDEX(27, rel_dpds, 0, 2) + INDEX(27, rel_dpds, 0, 2, ODS_13_0) SEGMENT(f_dpd_name, idx_metadata), // dependent name SEGMENT(f_dpd_type, idx_numeric) // dependent type }}, // define index RDB$INDEX_28 for RDB$DEPENDENCIES RDB$DEPENDED_ON_NAME, RDB$DEPENDED_ON_TYPE, RDB$FIELD_NAME; - INDEX(28, rel_dpds, 0, 3) + INDEX(28, rel_dpds, 0, 3, ODS_13_0) SEGMENT(f_dpd_o_name, idx_metadata), // dependent on name SEGMENT(f_dpd_o_type, idx_numeric), // dependent on type SEGMENT(f_dpd_f_name, idx_metadata) // field name }}, // define index RDB$INDEX_29 for RDB$USER_PRIVILEGES RDB$RELATION_NAME; - INDEX(29, rel_priv, 0, 1) + INDEX(29, rel_priv, 0, 1, ODS_13_0) SEGMENT(f_prv_rname, idx_metadata) // relation name }}, // define index RDB$INDEX_30 for RDB$USER_PRIVILEGES RDB$USER; - INDEX(30, rel_priv, 0, 1) + INDEX(30, rel_priv, 0, 1, ODS_13_0) SEGMENT(f_prv_user, idx_metadata) // granted user }}, // define index RDB$INDEX_31 for RDB$INDICES RDB$RELATION_NAME; - INDEX(31, rel_indices, 0, 1) + INDEX(31, rel_indices, 0, 1, ODS_13_0) SEGMENT(f_idx_relation, idx_metadata) // indexed relation }}, // define index RDB$INDEX_32 for RDB$TRANSACTIONS unique RDB$TRANSACTION_ID; - INDEX(32, rel_trans, idx_unique, 1) + INDEX(32, rel_trans, idx_unique, 1, ODS_13_0) SEGMENT(f_trn_id, idx_numeric) // transaction id }}, // define index RDB$INDEX_33 for RDB$VIEW_RELATIONS RDB$VIEW_NAME; - INDEX(33, rel_vrel, 0, 1) + INDEX(33, rel_vrel, 0, 1, ODS_13_0) SEGMENT(f_vrl_vname, idx_metadata) // view name }}, // define index RDB$INDEX_34 for RDB$VIEW_RELATIONS RDB$RELATION_NAME; - INDEX(34, rel_vrel, 0, 1) + INDEX(34, rel_vrel, 0, 1, ODS_13_0) SEGMENT(f_vrl_rname, idx_metadata) // base relation name }}, // define index RDB$INDEX_35 for RDB$TRIGGER_MESSAGES RDB$TRIGGER_NAME; - INDEX(35, rel_msgs, 0, 1) + INDEX(35, rel_msgs, 0, 1, ODS_13_0) SEGMENT(f_msg_trigger, idx_metadata) // trigger name }}, // define index RDB$INDEX_36 for RDB$FIELD_DIMENSIONS RDB$FIELD_NAME; - INDEX(36, rel_dims, 0, 1) + INDEX(36, rel_dims, 0, 1, ODS_13_0) SEGMENT(f_dims_fname, idx_metadata) // array name }}, // define index RDB$INDEX_37 for RDB$TYPES RDB$TYPE_NAME; - INDEX(37, rel_types, 0, 1) + INDEX(37, rel_types, 0, 1, ODS_13_0) SEGMENT(f_typ_name, idx_metadata) // type name }}, // define index RDB$INDEX_38 for RDB$TRIGGERS RDB$RELATION_NAME; - INDEX(38, rel_triggers, 0, 1) + INDEX(38, rel_triggers, 0, 1, ODS_13_0) SEGMENT(f_trg_rname, idx_metadata) // triggered relation }}, // define index RDB$INDEX_39 for RDB$ROLES unique RDB$ROLE_NAME; - INDEX(39, rel_roles, idx_unique, 1) + INDEX(39, rel_roles, idx_unique, 1, ODS_13_0) SEGMENT(f_rol_name, idx_metadata) // role name }}, // define index RDB$INDEX_40 for RDB$CHECK_CONSTRAINTS RDB$TRIGGER_NAME; - INDEX(40, rel_ccon, 0, 1) + INDEX(40, rel_ccon, 0, 1, ODS_13_0) SEGMENT(f_ccon_tname, idx_metadata) // trigger name }}, // define index RDB$INDEX_41 for RDB$INDICES RDB$FOREIGN_KEY; - INDEX(41, rel_indices, 0, 1) + INDEX(41, rel_indices, 0, 1, ODS_13_0) SEGMENT(f_idx_foreign, idx_metadata) // foreign key name }}, // define index RDB$INDEX_42 for RDB$RELATION_CONSTRAINTS RDB$RELATION_NAME, RDB$CONSTRAINT_TYPE; - INDEX(42, rel_rcon, 0, 2) + INDEX(42, rel_rcon, 0, 2, ODS_13_0) SEGMENT(f_rcon_rname, idx_metadata), // relation name SEGMENT(f_rcon_ctype, idx_metadata) // constraint type }}, // define index RDB$INDEX_43 for RDB$RELATION_CONSTRAINTS RDB$INDEX_NAME; - INDEX(43, rel_rcon, 0, 1) + INDEX(43, rel_rcon, 0, 1, ODS_13_0) SEGMENT(f_rcon_iname, idx_metadata), // index name }}, // define index RDB$INDEX_44 for RDB$BACKUP_HISTORY RDB$LEVEL, RDB$BACKUP_ID; - INDEX(44, rel_backup_history, idx_unique | idx_descending, 2) + INDEX(44, rel_backup_history, idx_unique | idx_descending, 2, ODS_13_0) SEGMENT(f_backup_level, idx_numeric), // backup level SEGMENT(f_backup_id, idx_numeric) // backup id }}, // define index RDB$INDEX_45 for RDB$FILTERS RDB$FUNCTION_NAME; - INDEX(45, rel_filters, idx_unique, 1) + INDEX(45, rel_filters, idx_unique, 1, ODS_13_0) SEGMENT(f_flt_name, idx_metadata) // function name }}, // define index RDB$INDEX_46 for RDB$GENERATORS unique RDB$GENERATOR_ID; - INDEX(46, rel_gens, idx_unique, 1) + INDEX(46, rel_gens, idx_unique, 1, ODS_13_0) SEGMENT(f_gen_id, idx_numeric) // generator id }}, // define index RDB$INDEX_47 for RDB$PACKAGES unique RDB$PACKAGE_NAME; - INDEX(47, rel_packages, idx_unique, 1) + INDEX(47, rel_packages, idx_unique, 1, ODS_13_0) SEGMENT(f_pkg_name, idx_metadata) // package name }}, // define index RDB$INDEX_48 for RDB$PROCEDURE_PARAMETERS RDB$FIELD_SOURCE; - INDEX(48, rel_prc_prms, 0, 1) + INDEX(48, rel_prc_prms, 0, 1, ODS_13_0) SEGMENT(f_prm_sname, idx_metadata) // field source name }}, // define index RDB$INDEX_49 for RDB$FUNCTION_ARGUMENTS RDB$FIELD_SOURCE; - INDEX(49, rel_args, 0, 1) + INDEX(49, rel_args, 0, 1, ODS_13_0) SEGMENT(f_arg_sname, idx_metadata) // field source name }}, // define index RDB$INDEX_50 for RDB$PROCEDURE_PARAMETERS RDB$RELATION_NAME, RDB$FIELD_NAME; - INDEX(50, rel_prc_prms, 0, 2) + INDEX(50, rel_prc_prms, 0, 2, ODS_13_0) SEGMENT(f_prm_rname, idx_metadata), // relation name SEGMENT(f_prm_fname, idx_metadata) // field name }}, // define index RDB$INDEX_51 for RDB$FUNCTION_ARGUMENTS RDB$RELATION_NAME, RDB$FIELD_NAME; - INDEX(51, rel_args, 0, 2) + INDEX(51, rel_args, 0, 2, ODS_13_0) SEGMENT(f_arg_rname, idx_metadata), // relation name SEGMENT(f_arg_fname, idx_metadata) // field name }}, // define index RDB$INDEX_52 for RDB$AUTH_MAPPING RDB$MAP_NAME; - INDEX(52, rel_auth_mapping, 0, 1) + INDEX(52, rel_auth_mapping, 0, 1, ODS_13_0) SEGMENT(f_map_name, idx_metadata) // mapping name }}, // define index RDB$INDEX_53 for RDB$FUNCTIONS unique RDB$FUNCTION_ID; - INDEX(53, rel_funs, idx_unique, 1) + INDEX(53, rel_funs, idx_unique, 1, ODS_13_0) SEGMENT(f_fun_id, idx_numeric) // function id }}, // define index RDB$INDEX_54 for RDB$BACKUP_HISTORY RDB$GUID; - INDEX(54, rel_backup_history, idx_unique, 1) + INDEX(54, rel_backup_history, idx_unique, 1, ODS_13_0) SEGMENT(f_backup_guid, idx_string) // backup guid }}, // define index RDB$INDEX_55 for RDB$PUBLICATIONS unique RDB$PUBLICATION_NAME; - INDEX(55, rel_pubs, idx_unique, 1) + INDEX(55, rel_pubs, idx_unique, 1, ODS_13_0) SEGMENT(f_pub_name, idx_string) // publication name }}, // define index RDB$INDEX_56 for RDB$PUBLICATION_TABLES unique RDB$TABLE_NAME, RDB$PUBLICATION_NAME; - INDEX(56, rel_pub_tables, idx_unique, 2) + INDEX(56, rel_pub_tables, idx_unique, 2, ODS_13_0) SEGMENT(f_pubtab_tab_name, idx_string), // table name SEGMENT(f_pubtab_pub_name, idx_string) // publication name }}, diff --git a/src/jrd/ini.epp b/src/jrd/ini.epp index c78fc409a5..4881415dbb 100644 --- a/src/jrd/ini.epp +++ b/src/jrd/ini.epp @@ -70,7 +70,7 @@ DATABASE DB = FILENAME "ODS.RDB"; const int FB_MAX_ACL_SIZE = 4096; -static void add_index_set(thread_db*); +static void add_index_set(thread_db*, USHORT = 0); static void add_security_to_sys_obj(thread_db*, AutoRequest&, AutoRequest&, AutoRequest&, const MetaName&, USHORT, const MetaName&, USHORT = 0, const UCHAR* = NULL); static void add_security_class(thread_db* tdbb, AutoRequest&, const MetaName& class_name, @@ -82,8 +82,9 @@ static void store_generator(thread_db*, const gen*, AutoRequest&, const MetaName static void store_global_field(thread_db*, const gfld*, AutoRequest&, const MetaName&); static void store_intlnames(thread_db*, const MetaName&); static void store_message(thread_db*, const trigger_msg*, AutoRequest&); -static void store_relation_field(thread_db*, const int*, const int*, int, AutoRequest&); -static void store_packages(thread_db* tdbb, const MetaName& owner); +static void store_relation(thread_db*, int, const char*, const char*, int, int, AutoRequest&); +static void store_relation_field(thread_db*, int, const char*, const char*, const char*, int, AutoRequest&); +static void store_packages(thread_db* tdbb, const MetaName& owner, USHORT = 0); static void store_trigger(thread_db*, const jrd_trg*, AutoRequest&); static void store_admin_grant(thread_db*, const char* grantee, USHORT grantee_type, const char* object, USHORT object_type, const char* prvl, USHORT option = 0, bool dflt = false); @@ -246,7 +247,7 @@ void INI_format(const char* owner, const char* charset) MetaName ownerName(owner); // Uppercase charset name - MetaName rdbCharSetName(charset && charset[0] ? charset : DEFAULT_DB_CHARACTER_SET_NAME); + MetaName charSetName(charset && charset[0] ? charset : DEFAULT_DB_CHARACTER_SET_NAME); const int* fld; @@ -267,35 +268,32 @@ void INI_format(const char* owner, const char* charset) // Store RELATIONS and RELATION_FIELDS - SLONG rdbRelationId; - MetaName rdbRelationName; - SLONG rdbFieldId; - SLONG rdbSystemFlag = RDB_system; - SLONG rdbRelationType; + AutoRequest handle1, handle2; - PreparedStatement::Builder sql; - sql << "insert into rdb$relations (rdb$relation_id, rdb$relation_name, rdb$field_id," - << "rdb$format, rdb$system_flag, rdb$dbkey_length, rdb$owner_name, rdb$relation_type)" - << "values (" << rdbRelationId << ", " << rdbRelationName << ", " << rdbFieldId << ", 0," - << rdbSystemFlag << ", 8, " << ownerName << ", " << rdbRelationType << ")"; - - AutoPreparedStatement ps(attachment->prepareStatement(tdbb, transaction, sql)); - - AutoRequest handle1; for (const int* relfld = relfields; relfld[RFLD_R_NAME]; relfld = fld + 1) { - for (rdbFieldId = 0, fld = relfld + RFLD_RPT; fld[RFLD_F_NAME]; fld += RFLD_F_LENGTH) + int fieldId = 0; + + for (fld = relfld + RFLD_RPT; fld[RFLD_F_NAME]; fld += RFLD_F_LENGTH) { - const int* pFld = fld; - const int* pRelFld = relfld; - store_relation_field(tdbb, pFld, pRelFld, rdbFieldId, handle1); - ++rdbFieldId; + const gfld* gfield = &gfields[fld[RFLD_F_ID]]; + const auto relId = relfld[RFLD_R_ID]; + const auto relName = names[relfld[RFLD_R_NAME]]; + const auto fieldName = names[fld[RFLD_F_NAME]]; + const auto globalName = names[gfield->gfld_name]; + const auto updateFlag = fld[RFLD_F_UPDATE]; + + store_relation_field(tdbb, fieldId, relName, fieldName, globalName, + updateFlag, handle1); + ++fieldId; } - rdbRelationId = relfld[RFLD_R_ID]; - rdbRelationName = names[relfld[RFLD_R_NAME]]; - rdbRelationType = relfld[RFLD_R_TYPE]; - ps->execute(tdbb, transaction); + const auto relId = relfld[RFLD_R_ID]; + const auto relName = names[relfld[RFLD_R_NAME]]; + const auto relType = relfld[RFLD_R_TYPE]; + + store_relation(tdbb, relId, relName, ownerName.c_str(), + fieldId, relType, handle2); } handle1.reset(); @@ -307,14 +305,13 @@ void INI_format(const char* owner, const char* charset) // Store DATABASE record - sql = PreparedStatement::Builder(); - sql << "insert into rdb$database (rdb$relation_id, rdb$character_set_name) values (" - << rdbRelationId << ", " << rdbCharSetName << ")"; + handle1.reset(); - ps.reset(attachment->prepareStatement(tdbb, transaction, sql)); - - rdbRelationId = USER_DEF_REL_INIT_ID; - ps->execute(tdbb, transaction); + STORE(REQUEST_HANDLE handle1) X IN RDB$DATABASE + X.RDB$RELATION_ID = (int) USER_DEF_REL_INIT_ID; + PAD(charSetName.c_str(), X.RDB$CHARACTER_SET_NAME); + X.RDB$CHARACTER_SET_NAME.NULL = FALSE; + END_STORE // Store default publication @@ -536,6 +533,7 @@ void INI_format(const char* owner, const char* charset) add_security_to_sys_obj(tdbb, reqAddSC, reqModObjSC, reqInsUserPriv, ownerName, obj_database, "", length, buffer); } + // Add security on system tables const UCHAR REL_OWNER_ACL[] = @@ -571,10 +569,13 @@ void INI_format(const char* owner, const char* charset) AutoRequest reqModObjSC, reqInsUserPriv; for (const int* relfld = relfields; relfld[RFLD_R_NAME]; relfld = fld + 1) { - for (rdbFieldId = 0, fld = relfld + RFLD_RPT; fld[RFLD_F_NAME]; fld += RFLD_F_LENGTH) - ++rdbFieldId; + int fieldId = 0; + for (fld = relfld + RFLD_RPT; fld[RFLD_F_NAME]; fld += RFLD_F_LENGTH) + ++fieldId; - add_security_to_sys_rel(tdbb, reqAddSC, reqModObjSC, reqInsUserPriv, ownerName, names[relfld[RFLD_R_NAME]], length, buffer); + const auto relName = names[relfld[RFLD_R_NAME]]; + + add_security_to_sys_rel(tdbb, reqAddSC, reqModObjSC, reqInsUserPriv, ownerName, relName, length, buffer); } } @@ -923,7 +924,168 @@ void INI_init_dsql(thread_db* tdbb, dsql_dbb* database) } -static void add_index_set(thread_db* tdbb) +void INI_upgrade(thread_db* tdbb) +{ +/************************************** + * + * I N I _ u p g r a d e + * + ************************************** + * + * Functional description + * Upgrade minor ODS version. + * + **************************************/ + const auto dbb = tdbb->getDatabase(); + const auto attachment = tdbb->getAttachment(); + + // If database is read-only, punt + if (dbb->dbb_flags & DBB_read_only) + Arg::Gds(isc_read_only).raise(); + + // Check current ODS version to see if we have work to do + + const auto majorVersion = dbb->dbb_ods_version; + fb_assert(majorVersion == ODS_VERSION); + + const auto minorVersion = dbb->dbb_minor_version; + if (minorVersion == ODS_CURRENT) + return; + + const auto odsVersion = ENCODE_ODS(majorVersion, minorVersion); + + const int* fld; + + // Make sure relations exist already + + for (const int* relfld = relfields; relfld[RFLD_R_NAME]; relfld = fld + 1) + { + if (relfld[RFLD_R_TYPE] == rel_persistent && + relfld[RFLD_R_ODS] > odsVersion) + { + DPM_create_relation(tdbb, MET_relation(tdbb, relfld[RFLD_R_ID])); + } + + for (fld = relfld + RFLD_RPT; fld[RFLD_F_NAME]; fld += RFLD_F_LENGTH) + ; + } + + AutoRequest handle1, handle2; + + // Get the database owner + + MetaName ownerName; + + FOR(REQUEST_HANDLE handle1) + FIRST 1 REL IN RDB$RELATIONS + WITH REL.RDB$RELATION_NAME EQ "RDB$DATABASE" + { + fb_assert(!REL.RDB$OWNER_NAME.NULL); + ownerName = REL.RDB$OWNER_NAME; + } + END_FOR + + // Create global fields added after the original minor ODS + + handle1.reset(); + + for (const gfld* gfield = gfields; gfield->gfld_name; gfield++) + { + if (gfield->gfld_ods_version > odsVersion) + store_global_field(tdbb, gfield, handle1, ownerName); + } + + // Create new system relations and new relation fields + + handle1.reset(); + + for (const int* relfld = relfields; relfld[RFLD_R_NAME]; relfld = fld + 1) + { + int fieldId = 0; + + for (fld = relfld + RFLD_RPT; fld[RFLD_F_NAME]; fld += RFLD_F_LENGTH) + { + if (fld[RFLD_F_ODS] > odsVersion) + { + const gfld* gfield = &gfields[fld[RFLD_F_ID]]; + const auto relId = relfld[RFLD_R_ID]; + const auto relName = names[relfld[RFLD_R_NAME]]; + const auto fieldName = names[fld[RFLD_F_NAME]]; + const auto globalName = names[gfield->gfld_name]; + const auto updateFlag = fld[RFLD_F_UPDATE]; + + store_relation_field(tdbb, fieldId, relName, fieldName, globalName, + updateFlag, handle1); + } + + ++fieldId; + } + + if (relfld[RFLD_R_ODS] > odsVersion) + { + const auto relId = relfld[RFLD_R_ID]; + const auto relName = names[relfld[RFLD_R_NAME]]; + const auto relType = relfld[RFLD_R_TYPE]; + + store_relation(tdbb, relId, relName, ownerName.c_str(), + fieldId, relType, handle2); + } + } + + // Create new system indexes + + add_index_set(tdbb, odsVersion); + + // Create new system triggers and their trigger messages + + handle1.reset(); + + for (const jrd_trg* trigger = triggers; trigger->trg_relation; ++trigger) + { + if (trigger->trg_ods_version > odsVersion) + store_trigger(tdbb, trigger, handle1); + } + + handle1.reset(); + + for (const trigger_msg* message = trigger_messages; message->trigmsg_name; ++message) + { + if (message->trg_ods_version > odsVersion) + store_message(tdbb, message, handle1); + } + + // Create new system generators + + handle1.reset(); + + for (const gen* generator = generators; generator->gen_name; generator++) + { + if (generator->gen_ods_version > odsVersion) + store_generator(tdbb, generator, handle1, ownerName); + } + + // Create new system packages + + store_packages(tdbb, ownerName, odsVersion); + + // Should we also add new types? They are collected from multiple sources and + // don't have their corresponding ODS defined. + // The same for new charsets/collations. + + // If the database was successfully updated, mark it with the current minor ODS + + win window(HEADER_PAGE_NUMBER); + auto header = (Ods::header_page*) CCH_FETCH(tdbb, &window, LCK_write, pag_header); + CCH_MARK(tdbb, &window); + + dbb->dbb_minor_version = header->hdr_ods_minor = ODS_CURRENT; + CCH_RELEASE(tdbb, &window); + + DFW_perform_system_work(tdbb); +} + + +static void add_index_set(thread_db* tdbb, USHORT odsVersion) { /************************************** * @@ -932,9 +1094,8 @@ static void add_index_set(thread_db* tdbb) ************************************** * * Functional description - * Add system indices. If update_ods is true we are performing - * an ODS update, and only add the indices marked as newer than - * ODS (major_version,minor_version). + * Add system indices. If odsVersion is specified, then we are performing + * an ODS update, so add only the indices marked as newer than odsVersion. * **************************************/ SET_TDBB(tdbb); @@ -949,6 +1110,9 @@ static void add_index_set(thread_db* tdbb) const ini_idx_t* index = &indices[n]; jrd_rel* relation = MET_relation(tdbb, index->ini_idx_relid); + if (odsVersion && index->ini_idx_ods <= odsVersion) + continue; + MetaName indexName; indexName.printf("RDB$INDEX_%d", index->ini_idx_index_id); @@ -1679,11 +1843,37 @@ static void store_message(thread_db* tdbb, const trigger_msg* message, AutoReque } -static void store_relation_field(thread_db* tdbb, - const int* fld, - const int* relfld, - int field_id, - AutoRequest& handle) +static void store_relation(thread_db* tdbb, + int relId, + const char* relName, + const char* ownerName, + int fieldId, + int relType, + AutoRequest& handle) +{ + SET_TDBB(tdbb); + const auto attachment = tdbb->getAttachment(); + + STORE(REQUEST_HANDLE handle) X IN RDB$RELATIONS + X.RDB$RELATION_ID = relId; + PAD(relName, X.RDB$RELATION_NAME); + PAD(ownerName, X.RDB$OWNER_NAME); + X.RDB$OWNER_NAME.NULL = FALSE; + X.RDB$FIELD_ID = fieldId; + X.RDB$FORMAT = 0; + X.RDB$SYSTEM_FLAG = RDB_system; + X.RDB$DBKEY_LENGTH = 8; + + END_STORE; +} + +static void store_relation_field(thread_db* tdbb, + int fieldId, + const char* relName, + const char* fieldName, + const char* globalName, + int updateFlag, + AutoRequest& handle) { /************************************** * @@ -1701,28 +1891,25 @@ static void store_relation_field(thread_db* tdbb, STORE(REQUEST_HANDLE handle) X IN RDB$RELATION_FIELDS { - const gfld* gfield = &gfields[fld[RFLD_F_ID]]; - PAD(names[relfld[RFLD_R_NAME]], X.RDB$RELATION_NAME); - PAD(names[fld[RFLD_F_NAME]], X.RDB$FIELD_NAME); - PAD(names[gfield->gfld_name], X.RDB$FIELD_SOURCE); - X.RDB$FIELD_POSITION = field_id; - X.RDB$FIELD_ID = field_id; + PAD(relName, X.RDB$RELATION_NAME); + PAD(fieldName, X.RDB$FIELD_NAME); + PAD(globalName, X.RDB$FIELD_SOURCE); + X.RDB$FIELD_POSITION = fieldId; + X.RDB$FIELD_ID = fieldId; X.RDB$SYSTEM_FLAG = RDB_system; X.RDB$SYSTEM_FLAG.NULL = FALSE; - X.RDB$UPDATE_FLAG = fld[RFLD_F_UPDATE]; + X.RDB$UPDATE_FLAG = updateFlag; } END_STORE } // Store system packages. -static void store_packages(thread_db* tdbb, const MetaName& owner) +static void store_packages(thread_db* tdbb, const MetaName& owner, USHORT odsVersion) { SET_TDBB(tdbb); Jrd::Attachment* attachment = tdbb->getAttachment(); Database* const dbb = tdbb->getDatabase(); - const USHORT majorVersion = dbb->dbb_ods_version; - const USHORT minorVersion = dbb->dbb_minor_version; AutoRequest packageHandle, procedureHandle, procedureParameterHandle; AutoRequest functionHandle, functionReturnHandle, functionArgumentHandle; @@ -1731,7 +1918,7 @@ static void store_packages(thread_db* tdbb, const MetaName& owner) for (auto& systemPackage : SystemPackage::get()) { - if (systemPackage.odsVersion > ENCODE_ODS(majorVersion, minorVersion)) + if (odsVersion && systemPackage.odsVersion < odsVersion) continue; STORE (REQUEST_HANDLE packageHandle) PKG IN RDB$PACKAGES diff --git a/src/jrd/ini.h b/src/jrd/ini.h index 7813788991..9cc22cf22f 100644 --- a/src/jrd/ini.h +++ b/src/jrd/ini.h @@ -75,7 +75,7 @@ const USHORT TIMESTAMP_TZ_SIZE = 12; // Pick up global ids -#define FIELD(type, name, dtype, length, sub_type, dflt_blr, nullable) type, +#define FIELD(type, name, dtype, length, sub_type, dflt_blr, nullable, ods) type, enum gflds { #include "../jrd/fields.h" @@ -88,11 +88,11 @@ typedef gflds GFLDS; // Pick up actual global fields #ifndef GPRE -#define FIELD(type, name, dtype, length, sub_type, dflt_blr, nullable) \ - { (int) type, (int) name, dtype, length, sub_type, dflt_blr, sizeof(dflt_blr), nullable }, +#define FIELD(type, name, dtype, length, sub_type, dflt_blr, nullable, ods) \ + { (int) type, (int) name, dtype, length, sub_type, dflt_blr, sizeof(dflt_blr), nullable, ods }, #else -#define FIELD(type, name, dtype, length, sub_type, dflt_blr, nullable) \ - { (int) type, (int) name, dtype, length, sub_type, NULL, 0, true }, +#define FIELD(type, name, dtype, length, sub_type, dflt_blr, nullable, ods) \ + { (int) type, (int) name, dtype, length, sub_type, NULL, 0, true, ods }, #endif struct gfld @@ -105,12 +105,13 @@ struct gfld const UCHAR* gfld_dflt_blr; USHORT gfld_dflt_len; bool gfld_nullable; + USHORT gfld_ods_version; }; static const struct gfld gfields[] = { #include "../jrd/fields.h" - { 0, 0, dtype_unknown, 0, 0, NULL, 0, false } + { 0, 0, dtype_unknown, 0, 0, NULL, 0, false, 0 } }; #undef FIELD diff --git a/src/jrd/ini_proto.h b/src/jrd/ini_proto.h index 8c35458751..1874094879 100644 --- a/src/jrd/ini_proto.h +++ b/src/jrd/ini_proto.h @@ -35,5 +35,6 @@ void INI_init(Jrd::thread_db*); void INI_init2(Jrd::thread_db*); void INI_init_dsql(Jrd::thread_db*, Jrd::dsql_dbb* database); Firebird::string INI_owner_privileges(); +void INI_upgrade(Jrd::thread_db*); #endif // JRD_INI_PROTO_H diff --git a/src/jrd/jrd.cpp b/src/jrd/jrd.cpp index 5cb75995a4..168b5ac842 100644 --- a/src/jrd/jrd.cpp +++ b/src/jrd/jrd.cpp @@ -1083,6 +1083,7 @@ namespace Jrd ReplicaMode dpb_replica_mode; bool dpb_set_db_replica; bool dpb_clear_map; + bool dpb_upgrade_db; // here begin compound objects // for constructor to work properly dpb_user_name @@ -1835,6 +1836,12 @@ JAttachment* JProvider::internalAttach(CheckStatusWrapper* user_status, const ch dbb->dbb_tip_cache = FB_NEW_POOL(*dbb->dbb_permanent) TipCache(dbb); dbb->dbb_tip_cache->initializeTpc(tdbb); + if (options.dpb_upgrade_db) + { + validateAccess(tdbb, attachment, USE_GFIX_UTILITY); + INI_upgrade(tdbb); + } + // linger dbb->dbb_linger_seconds = MET_get_linger(tdbb); @@ -7248,6 +7255,9 @@ void DatabaseOptions::get(const UCHAR* dpb, USHORT dpb_length, bool& invalid_cli case isc_dpb_worker_attach: dpb_worker_attach = true; + + case isc_dpb_upgrade_db: + dpb_upgrade_db = true; break; default: diff --git a/src/jrd/trig.h b/src/jrd/trig.h index dfe416a2aa..c80683474c 100644 --- a/src/jrd/trig.h +++ b/src/jrd/trig.h @@ -62,6 +62,7 @@ struct gen const char* gen_name; USHORT gen_id; const char* gen_description; + USHORT gen_ods_version; }; } //namespace Jrd @@ -70,18 +71,18 @@ struct gen // Keep in sync with constants.h static const Jrd::gen generators[] = { - { "RDB$SECURITY_CLASS", 1, NULL }, - { "SQL$DEFAULT", 2, NULL }, - { PROCEDURES_GENERATOR, 3, "Procedure ID" }, - { "RDB$EXCEPTIONS", 4, "Exception ID" }, - { "RDB$CONSTRAINT_NAME", 5, "Implicit constraint name" }, - { "RDB$FIELD_NAME", 6, "Implicit domain name" }, - { "RDB$INDEX_NAME", 7, "Implicit index name" }, - { "RDB$TRIGGER_NAME", 8, "Implicit trigger name" }, - { "RDB$BACKUP_HISTORY", 9, "Nbackup technology" }, - { FUNCTIONS_GENERATOR, 10, "Function ID" }, - { "RDB$GENERATOR_NAME", 11, "Implicit generator name" }, - { nullptr, 0, nullptr } + { "RDB$SECURITY_CLASS", 1, NULL, ODS_13_0 }, + { "SQL$DEFAULT", 2, NULL, ODS_13_0 }, + { PROCEDURES_GENERATOR, 3, "Procedure ID", ODS_13_0 }, + { "RDB$EXCEPTIONS", 4, "Exception ID", ODS_13_0 }, + { "RDB$CONSTRAINT_NAME", 5, "Implicit constraint name", ODS_13_0 }, + { "RDB$FIELD_NAME", 6, "Implicit domain name", ODS_13_0 }, + { "RDB$INDEX_NAME", 7, "Implicit index name", ODS_13_0 }, + { "RDB$TRIGGER_NAME", 8, "Implicit trigger name", ODS_13_0 }, + { "RDB$BACKUP_HISTORY", 9, "Nbackup technology", ODS_13_0 }, + { FUNCTIONS_GENERATOR, 10, "Function ID", ODS_13_0 }, + { "RDB$GENERATOR_NAME", 11, "Implicit generator name", ODS_13_0 }, + { nullptr, 0, nullptr, 0 } };