@@ -110,6 +110,13 @@ fn ulid_to_uuid(input: ulid) -> Uuid {
110
110
Uuid :: from_bytes ( bytes)
111
111
}
112
112
113
+ #[ pg_extern( immutable, parallel_safe) ]
114
+ fn ulid_to_bytea ( input : ulid ) -> Vec < u8 > {
115
+ let mut bytes = input. 0 . to_ne_bytes ( ) ;
116
+ bytes. reverse ( ) ;
117
+ bytes. to_vec ( )
118
+ }
119
+
113
120
#[ pg_extern( immutable, parallel_safe) ]
114
121
fn ulid_to_timestamp ( input : ulid ) -> Timestamp {
115
122
let inner_seconds = ( InnerUlid ( input. 0 ) . timestamp_ms ( ) as f64 ) / 1000.0 ;
@@ -135,6 +142,7 @@ extension_sql!(
135
142
r#"
136
143
CREATE CAST (uuid AS ulid) WITH FUNCTION ulid_from_uuid(uuid) AS IMPLICIT;
137
144
CREATE CAST (ulid AS uuid) WITH FUNCTION ulid_to_uuid(ulid) AS IMPLICIT;
145
+ CREATE CAST (ulid AS bytea) WITH FUNCTION ulid_to_bytea(ulid) AS IMPLICIT;
138
146
CREATE CAST (ulid AS timestamp) WITH FUNCTION ulid_to_timestamp(ulid) AS IMPLICIT;
139
147
CREATE CAST (timestamp AS ulid) WITH FUNCTION timestamp_to_ulid(timestamp) AS IMPLICIT;
140
148
"# ,
@@ -149,6 +157,9 @@ mod tests {
149
157
const INT : u128 = 2029121117734015635515926905565997019 ;
150
158
const TEXT : & str = "01GV5PA9EQG7D82Q3Y4PKBZSYV" ;
151
159
const UUID : & str = "0186cb65-25d7-81da-815c-7e25a6bfe7db" ;
160
+ const BYTEA : & [ u8 ] = & [
161
+ 1 , 134 , 203 , 101 , 37 , 215 , 129 , 218 , 129 , 92 , 126 , 37 , 166 , 191 , 231 , 219 ,
162
+ ] ;
152
163
const TIMESTAMP : & str = "2023-03-10 12:00:49.111" ;
153
164
154
165
#[ pg_test]
@@ -211,6 +222,13 @@ mod tests {
211
222
assert_eq ! ( Some ( UUID ) , result) ;
212
223
}
213
224
225
+ #[ pg_test]
226
+ fn test_ulid_to_bytea ( ) {
227
+ let result = Spi :: get_one :: < & [ u8 ] > ( & format ! ( "SELECT '{TEXT}'::ulid::bytea;" ) ) . unwrap ( ) ;
228
+
229
+ assert_eq ! ( Some ( BYTEA ) , result) ;
230
+ }
231
+
214
232
#[ pg_test]
215
233
fn test_uuid_to_ulid ( ) {
216
234
let result = Spi :: get_one :: < ulid > ( & format ! ( "SELECT '{UUID}'::uuid::ulid;" ) ) . unwrap ( ) ;
0 commit comments