|
| 1 | +mod common; |
| 2 | + |
| 3 | +use common::*; |
| 4 | +use pgwire::api::query::SimpleQueryHandler; |
| 5 | + |
| 6 | +const DATAGRIP_QUERIES: &[&str] = &[ |
| 7 | + "SET extra_float_digits = 3", |
| 8 | + "SET application_name = ''", |
| 9 | + "select version()", |
| 10 | + "SET application_name = 'DataGrip 2025.2.3'", |
| 11 | + "select current_database() as a, current_schemas(false) as b", |
| 12 | + "SHOW TRANSACTION ISOLATION LEVEL", |
| 13 | + "select round(extract(epoch from pg_postmaster_start_time() at time zone 'UTC')) as startup_time", |
| 14 | + "select L.transactionid::varchar::bigint as transaction_id |
| 15 | + from pg_catalog.pg_locks L |
| 16 | + where L.transactionid is not null |
| 17 | + order by pg_catalog.age(L.transactionid) desc |
| 18 | + limit 1", |
| 19 | + "select case |
| 20 | + when pg_catalog.pg_is_in_recovery() |
| 21 | + then null |
| 22 | + else |
| 23 | + (pg_catalog.txid_current() % 4294967296)::varchar::bigint |
| 24 | + end as current_txid", |
| 25 | + r#"select N.oid::bigint as id, |
| 26 | + datname as name, |
| 27 | + D.description, |
| 28 | + datistemplate as is_template, |
| 29 | + datallowconn as allow_connections, |
| 30 | + pg_catalog.pg_get_userbyid(N.datdba) as "owner" |
| 31 | + from pg_catalog.pg_database N |
| 32 | + left join pg_catalog.pg_shdescription D on N.oid = D.objoid |
| 33 | + order by case when datname = pg_catalog.current_database() then -1::bigint else N.oid::bigint end"#, |
| 34 | + r#"select N.oid::bigint as id, |
| 35 | + N.xmin as state_number, |
| 36 | + nspname as name, |
| 37 | + D.description, |
| 38 | + pg_catalog.pg_get_userbyid(N.nspowner) as "owner" |
| 39 | + from pg_catalog.pg_namespace N |
| 40 | + left join pg_catalog.pg_description D on N.oid = D.objoid |
| 41 | + order by case when nspname = pg_catalog.current_schema() then -1::bigint else N.oid::bigint end"#, |
| 42 | + r#"SELECT typinput='pg_catalog.array_in'::regproc as is_array, typtype, typname, pg_type.oid FROM pg_catalog.pg_type LEFT JOIN (select ns.oid as nspoid, ns.nspname, r.r from pg_namespace as ns join ( select s.r, (current_schemas(false))[s.r] as nspname from generate_series(1, array_upper(current_schemas(false), 1)) as s(r) ) as r using ( nspname ) ) as sp ON sp.nspoid = typnamespace WHERE pg_type.oid = '28' ORDER BY sp.r, pg_type.oid DESC"#, |
| 43 | + r#"show DateStyle"#, |
| 44 | + r#"select name, is_dst from pg_catalog.pg_timezone_names |
| 45 | + union distinct |
| 46 | + select abbrev as name, is_dst from pg_catalog.pg_timezone_abbrevs"#, |
| 47 | + r#"select R.oid::bigint as role_id, rolname as role_name, |
| 48 | + rolsuper is_super, rolinherit is_inherit, |
| 49 | + rolcreaterole can_createrole, rolcreatedb can_createdb, |
| 50 | + rolcanlogin can_login, rolreplication /* false */ is_replication, |
| 51 | + rolconnlimit conn_limit, rolvaliduntil valid_until, |
| 52 | + rolbypassrls /* false */ bypass_rls, rolconfig config, |
| 53 | + D.description |
| 54 | + from pg_catalog.pg_roles R |
| 55 | + left join pg_catalog.pg_shdescription D on D.objoid = R.oid"#, |
| 56 | + r#"select member id, roleid role_id, admin_option |
| 57 | + from pg_catalog.pg_auth_members order by id, roleid::text"#, |
| 58 | + r#"select T.oid::bigint as id, T.spcname as name, |
| 59 | + T.xmin as state_number, pg_catalog.pg_get_userbyid(T.spcowner) as owner, |
| 60 | + pg_catalog.pg_tablespace_location(T.oid) /* null */ as location, |
| 61 | + T.spcoptions /* null */ as options, |
| 62 | + D.description as comment |
| 63 | + from pg_catalog.pg_tablespace T |
| 64 | + left join pg_catalog.pg_shdescription D on D.objoid = T.oid |
| 65 | + -- where pg_catalog.age(T.xmin) <= #TXAGE"#, |
| 66 | + r#"select T.oid as object_id, |
| 67 | + T.spcacl as acl |
| 68 | + from pg_catalog.pg_tablespace T |
| 69 | + union all |
| 70 | + select T.oid as object_id, |
| 71 | + T.datacl as acl |
| 72 | + from pg_catalog.pg_database T"#, |
| 73 | + r#" SELECT typinput='pg_catalog.array_in'::regproc as is_array, typtype, typname, pg_type.oid FROM pg_catalog.pg_type LEFT JOIN (select ns.oid as nspoid, ns.nspname, r.r from pg_namespace as ns join ( select s.r, (current_schemas(false))[s.r] as nspname from generate_series(1, array_upper(current_schemas(false), 1)) as s(r) ) as r using ( nspname ) ) as sp ON sp.nspoid = typnamespace WHERE pg_type.oid = '1034' ORDER BY sp.r, pg_type.oid DESC"#, |
| 74 | + r#"SELECT e.typdelim FROM pg_catalog.pg_type t, pg_catalog.pg_type e WHERE t.oid = '1034' and t.typelem = e.oid"#, |
| 75 | + r#" SELECT e.oid, n.nspname = ANY(current_schemas(true)), n.nspname, e.typname FROM pg_catalog.pg_type t JOIN pg_catalog.pg_type e ON t.typelem = e.oid JOIN pg_catalog.pg_namespace n ON t.typnamespace = n.oid WHERE t.oid = '1034'"#, |
| 76 | + r#"SELECT typinput='pg_catalog.array_in'::regproc as is_array, typtype, typname, pg_type.oid FROM pg_catalog.pg_type LEFT JOIN (select ns.oid as nspoid, ns.nspname, r.r from pg_namespace as ns join ( select s.r, (current_schemas(false))[s.r] as nspname from generate_series(1, array_upper(current_schemas(false), 1)) as s(r) ) as r using ( nspname ) ) as sp ON sp.nspoid = typnamespace WHERE pg_type.oid = '1033' ORDER BY sp.r, pg_type.oid DESC"#, |
| 77 | +]; |
| 78 | + |
| 79 | +#[tokio::test] |
| 80 | +pub async fn test_datagrip_startup_sql() { |
| 81 | + env_logger::init(); |
| 82 | + let service = setup_handlers(); |
| 83 | + let mut client = MockClient::new(); |
| 84 | + |
| 85 | + for query in DATAGRIP_QUERIES { |
| 86 | + SimpleQueryHandler::do_query(&service, &mut client, query) |
| 87 | + .await |
| 88 | + .unwrap_or_else(|e| { |
| 89 | + panic!("failed to run sql:\n-----------------\n {query}\n-----------------\n {e}") |
| 90 | + }); |
| 91 | + } |
| 92 | +} |
0 commit comments