1
+ CREATE TABLE IF NOT EXISTS storage .s3_multipart_uploads (
2
+ id text PRIMARY KEY ,
3
+ in_progress_size int NOT NULL default 0 ,
4
+ upload_signature text NOT NULL ,
5
+ bucket_id text NOT NULL references storage .buckets (id),
6
+ key text COLLATE " C" NOT NULL ,
7
+ version text NOT NULL ,
8
+ owner_id text NULL ,
9
+ created_at timestamptz NOT NULL default now()
10
+ );
11
+
12
+ CREATE TABLE IF NOT EXISTS storage .s3_multipart_uploads_parts (
13
+ id uuid PRIMARY KEY default gen_random_uuid(),
14
+ upload_id text NOT NULL references storage .s3_multipart_uploads (id) ON DELETE CASCADE ,
15
+ size int NOT NULL default 0 ,
16
+ part_number int NOT NULL ,
17
+ bucket_id text NOT NULL references storage .buckets (id),
18
+ key text COLLATE " C" NOT NULL ,
19
+ etag text NOT NULL ,
20
+ owner_id text NULL ,
21
+ version text NOT NULL ,
22
+ created_at timestamptz NOT NULL default now()
23
+ );
24
+
25
+ CREATE INDEX IF NOT EXISTS idx_multipart_uploads_list
26
+ ON storage .s3_multipart_uploads (bucket_id, (key COLLATE " C" ), created_at ASC );
27
+
28
+ CREATE OR REPLACE FUNCTION storage .list_multipart_uploads_with_delimiter(bucket_id text , prefix_param text , delimiter_param text , max_keys integer default 100 , next_key_token text DEFAULT ' ' , next_upload_token text default ' ' )
29
+ RETURNS TABLE (key text , id text , created_at timestamptz ) AS
30
+ $$
31
+ BEGIN
32
+ RETURN QUERY EXECUTE
33
+ ' SELECT DISTINCT ON(key COLLATE "C") * from (
34
+ SELECT
35
+ CASE
36
+ WHEN position($2 IN substring(key from length($1) + 1)) > 0 THEN
37
+ substring(key from 1 for length($1) + position($2 IN substring(key from length($1) + 1)))
38
+ ELSE
39
+ key
40
+ END AS key, id, created_at
41
+ FROM
42
+ storage.s3_multipart_uploads
43
+ WHERE
44
+ bucket_id = $5 AND
45
+ key ILIKE $1 || ' ' %' ' AND
46
+ CASE
47
+ WHEN $4 != ' ' ' ' AND $6 = ' ' ' ' THEN
48
+ CASE
49
+ WHEN position($2 IN substring(key from length($1) + 1)) > 0 THEN
50
+ substring(key from 1 for length($1) + position($2 IN substring(key from length($1) + 1))) COLLATE "C" > $4
51
+ ELSE
52
+ key COLLATE "C" > $4
53
+ END
54
+ ELSE
55
+ true
56
+ END AND
57
+ CASE
58
+ WHEN $6 != ' ' ' ' THEN
59
+ id COLLATE "C" > $6
60
+ ELSE
61
+ true
62
+ END
63
+ ORDER BY
64
+ key COLLATE "C" ASC, created_at ASC) as e order by key COLLATE "C" LIMIT $3'
65
+ USING prefix_param, delimiter_param, max_keys, next_key_token, bucket_id, next_upload_token;
66
+ END;
67
+ $$ LANGUAGE plpgsql;
68
+
69
+ ALTER TABLE storage .s3_multipart_uploads ENABLE ROW LEVEL SECURITY;
70
+ ALTER TABLE storage .s3_multipart_uploads_parts ENABLE ROW LEVEL SECURITY;
71
+
72
+ DO $$
73
+ DECLARE
74
+ anon_role text = COALESCE(current_setting(' storage.anon_role' , true), ' anon' );
75
+ authenticated_role text = COALESCE(current_setting(' storage.authenticated_role' , true), ' authenticated' );
76
+ service_role text = COALESCE(current_setting(' storage.service_role' , true), ' service_role' );
77
+ BEGIN
78
+ EXECUTE ' revoke all on storage.s3_multipart_uploads from ' || anon_role || ' , ' || authenticated_role;
79
+ EXECUTE ' revoke all on storage.s3_multipart_uploads_parts from ' || anon_role || ' , ' || authenticated_role;
80
+ EXECUTE ' GRANT ALL ON TABLE storage.s3_multipart_uploads TO ' || service_role;
81
+ EXECUTE ' GRANT ALL ON TABLE storage.s3_multipart_uploads_parts TO ' || service_role;
82
+ EXECUTE ' GRANT SELECT ON TABLE storage.s3_multipart_uploads TO ' || authenticated_role || ' , ' || anon_role;
83
+ EXECUTE ' GRANT SELECT ON TABLE storage.s3_multipart_uploads_parts TO ' || authenticated_role || ' , ' || anon_role;
84
+ END$$;
0 commit comments