@@ -1227,7 +1227,7 @@ class GetDatabaseFrontendNameFunction(trampoline.VersionedFunction):
1227
1227
THEN
1228
1228
substring(db_name, position('_' in db_name) + 1)
1229
1229
ELSE
1230
- 'edgedb '
1230
+ 'main '
1231
1231
END
1232
1232
'''
1233
1233
@@ -7143,22 +7143,36 @@ def make_wrapper_view(name: str) -> trampoline.VersionedView:
7143
7143
query = """
7144
7144
SELECT
7145
7145
oid,
7146
- edgedb_VER.get_current_database()::name as datname,
7146
+ frontend_name.n as datname,
7147
7147
datdba,
7148
7148
encoding,
7149
+ datlocprovider,
7149
7150
datcollate,
7150
7151
datctype,
7151
7152
datistemplate,
7152
7153
datallowconn,
7154
+ dathasloginevt,
7153
7155
datconnlimit,
7154
7156
0::oid AS datlastsysoid,
7155
7157
datfrozenxid,
7156
7158
datminmxid,
7157
7159
dattablespace,
7160
+ datlocale,
7161
+ daticurules,
7162
+ datcollversion,
7158
7163
datacl,
7159
7164
tableoid, xmin, cmin, xmax, cmax, ctid
7160
- FROM pg_database
7161
- WHERE datname LIKE '%_edgedb'
7165
+ FROM
7166
+ pg_database,
7167
+ LATERAL (
7168
+ SELECT edgedb_VER.get_database_frontend_name(datname) AS n
7169
+ ) frontend_name,
7170
+ LATERAL (
7171
+ SELECT edgedb_VER.get_database_metadata(frontend_name.n) AS j
7172
+ ) metadata
7173
+ WHERE
7174
+ metadata.j->>'tenant_id' = edgedb_VER.get_backend_tenant_id()
7175
+ AND NOT (metadata.j->'builtin')::bool
7162
7176
""" ,
7163
7177
),
7164
7178
@@ -7692,6 +7706,65 @@ def construct_pg_view(
7692
7706
views .append (v )
7693
7707
7694
7708
util_functions = [
7709
+ # WARNING: this `edgedbsql.to_regclass()` function is currently not
7710
+ # accurately implemented to take application-level `search_path`
7711
+ # into consideration. It is currently here to support the following
7712
+ # `has_*privilege` functions (which are less sensitive to such issue).
7713
+ # SO DO NOT USE `edgedbsql.to_regclass()` FOR ANYTHING ELSE.
7714
+ trampoline .VersionedFunction (
7715
+ name = ('edgedbsql' , 'to_regclass' ),
7716
+ args = (
7717
+ ('name' , 'text' ,),
7718
+ ),
7719
+ returns = ('regclass' ,),
7720
+ text = """
7721
+ SELECT
7722
+ CASE
7723
+ WHEN array_length(parts, 1) = 1 THEN
7724
+ (
7725
+ SELECT oid::regclass
7726
+ FROM edgedbsql_VER.pg_class
7727
+ WHERE relname = parts[1]
7728
+ LIMIT 1 -- HACK: see comments above
7729
+ )
7730
+ WHEN array_length(parts, 1) = 2 THEN
7731
+ (
7732
+ SELECT pc.oid::regclass
7733
+ FROM edgedbsql_VER.pg_class pc
7734
+ JOIN edgedbsql_VER.pg_namespace pn
7735
+ ON pn.oid = pc.relnamespace
7736
+ WHERE relname = parts[2] AND nspname = parts[1]
7737
+ )
7738
+ ELSE
7739
+ NULL::regclass
7740
+ END
7741
+ FROM parse_ident(name) parts
7742
+ """
7743
+ ),
7744
+ trampoline .VersionedFunction (
7745
+ name = ('edgedbsql' , 'has_database_privilege' ),
7746
+ args = (
7747
+ ('database_name' , 'text' ),
7748
+ ('privilege' , 'text' ),
7749
+ ),
7750
+ returns = ('bool' ,),
7751
+ text = """
7752
+ SELECT has_database_privilege(oid, privilege)
7753
+ FROM edgedbsql_VER.pg_database
7754
+ WHERE datname = database_name
7755
+ """
7756
+ ),
7757
+ trampoline .VersionedFunction (
7758
+ name = ('edgedbsql' , 'has_database_privilege' ),
7759
+ args = (
7760
+ ('database_oid' , 'oid' ),
7761
+ ('privilege' , 'text' ),
7762
+ ),
7763
+ returns = ('bool' ,),
7764
+ text = """
7765
+ SELECT has_database_privilege(database_oid, privilege)
7766
+ """
7767
+ ),
7695
7768
trampoline .VersionedFunction (
7696
7769
name = ('edgedbsql' , 'has_schema_privilege' ),
7697
7770
args = (
@@ -7728,20 +7801,19 @@ def construct_pg_view(
7728
7801
),
7729
7802
returns = ('bool' ,),
7730
7803
text = """
7731
- SELECT has_table_privilege(oid, privilege)
7732
- FROM edgedbsql_VER.pg_class
7733
- WHERE relname = table_name;
7804
+ SELECT has_table_privilege(
7805
+ edgedbsql_VER.to_regclass(table_name), privilege)
7734
7806
"""
7735
7807
),
7736
7808
trampoline .VersionedFunction (
7737
7809
name = ('edgedbsql' , 'has_table_privilege' ),
7738
7810
args = (
7739
- ('schema_oid ' , 'oid' ),
7811
+ ('table_oid ' , 'oid' ),
7740
7812
('privilege' , 'text' ),
7741
7813
),
7742
7814
returns = ('bool' ,),
7743
7815
text = """
7744
- SELECT has_table_privilege(schema_oid , privilege)
7816
+ SELECT has_table_privilege(table_oid , privilege)
7745
7817
"""
7746
7818
),
7747
7819
@@ -7766,9 +7838,8 @@ def construct_pg_view(
7766
7838
),
7767
7839
returns = ('bool' ,),
7768
7840
text = """
7769
- SELECT has_column_privilege(oid, col, privilege)
7770
- FROM edgedbsql_VER.pg_class
7771
- WHERE relname = tbl;
7841
+ SELECT has_column_privilege(
7842
+ edgedbsql_VER.to_regclass(tbl), col, privilege)
7772
7843
"""
7773
7844
),
7774
7845
trampoline .VersionedFunction (
@@ -7795,9 +7866,32 @@ def construct_pg_view(
7795
7866
returns = ('bool' ,),
7796
7867
text = """
7797
7868
SELECT has_column_privilege(pc.oid, attnum_internal, privilege)
7798
- FROM edgedbsql_VER.pg_class pc
7799
- JOIN edgedbsql_VER.pg_attribute_ext pa ON pa.attrelid = pc.oid
7800
- WHERE pc.relname = tbl AND pa.attname = col;
7869
+ FROM edgedbsql_VER.pg_attribute_ext pa,
7870
+ LATERAL (SELECT edgedbsql_VER.to_regclass(tbl) AS oid) pc
7871
+ WHERE pa.attrelid = pc.oid AND pa.attname = col
7872
+ """
7873
+ ),
7874
+ trampoline .VersionedFunction (
7875
+ name = ('edgedbsql' , 'has_any_column_privilege' ),
7876
+ args = (
7877
+ ('tbl' , 'oid' ),
7878
+ ('privilege' , 'text' ),
7879
+ ),
7880
+ returns = ('bool' ,),
7881
+ text = """
7882
+ SELECT has_any_column_privilege(tbl, privilege)
7883
+ """
7884
+ ),
7885
+ trampoline .VersionedFunction (
7886
+ name = ('edgedbsql' , 'has_any_column_privilege' ),
7887
+ args = (
7888
+ ('tbl' , 'text' ),
7889
+ ('privilege' , 'text' ),
7890
+ ),
7891
+ returns = ('bool' ,),
7892
+ text = """
7893
+ SELECT has_any_column_privilege(
7894
+ edgedbsql_VER.to_regclass(tbl), privilege)
7801
7895
"""
7802
7896
),
7803
7897
trampoline .VersionedFunction (
0 commit comments