We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
1 parent feaa5dc commit 4e802fdCopy full SHA for 4e802fd
CHANGELOG.md
@@ -1,3 +1,7 @@
1
+## 0.1.1 (unreleased)
2
+
3
+- Added support for binary decoding
4
5
## 0.1.0 (2025-06-07)
6
7
- First release
src/halfvec.jl
@@ -1,8 +1,31 @@
+using LibPQ
struct HalfVector
vec::Base.Vector{Float16}
end
-function Base.parse(::Type{HalfVector}, s::String)
+function Base.parse(::Type{HalfVector}, pqv::LibPQ.PQBinaryValue{OID}) where {OID}
8
+ ptr = LibPQ.data_pointer(pqv)
9
10
+ dim = ntoh(unsafe_load(Ptr{Int16}(ptr)))
11
+ ptr += sizeof(Int16)
12
13
+ # TODO check unused
14
+ unused = ntoh(unsafe_load(Ptr{Int16}(ptr)))
15
16
17
+ vec = []
18
+ for i = 1:dim
19
+ v = ntoh(unsafe_load(Ptr{Float16}(ptr)))
20
+ ptr += sizeof(Float16)
21
+ append!(vec, v)
22
+ end
23
24
+ HalfVector(vec)
25
+end
26
27
+function Base.parse(::Type{HalfVector}, pqv::LibPQ.PQTextValue{OID}) where {OID}
28
+ s = unsafe_string(pqv)
29
HalfVector(map(x -> Base.parse(Float16, x), split(s[2:end-1], ",")))
30
31
src/sparsevec.jl
@@ -1,10 +1,41 @@
-using SparseArrays
+using LibPQ, SparseArrays
struct SparseVector
vec::SparseArrays.SparseVector{Float32,Int32}
-function Base.parse(::Type{SparseVector}, s::String)
+function Base.parse(::Type{SparseVector}, pqv::LibPQ.PQBinaryValue{OID}) where {OID}
+ dim = ntoh(unsafe_load(Ptr{Int32}(ptr)))
+ ptr += sizeof(Int32)
+ nnz = ntoh(unsafe_load(Ptr{Int32}(ptr)))
+ unused = ntoh(unsafe_load(Ptr{Int32}(ptr)))
+ indices = []
+ for i = 1:nnz
+ v = ntoh(unsafe_load(Ptr{Int32}(ptr)))
+ append!(indices, v + 1)
+ values = []
+ v = ntoh(unsafe_load(Ptr{Float32}(ptr)))
+ ptr += sizeof(Float32)
+ append!(values, v)
32
33
34
+ SparseVector(sparsevec(indices, values, dim))
35
36
37
+function Base.parse(::Type{SparseVector}, pqv::LibPQ.PQTextValue{OID}) where {OID}
38
39
elements, dim = rsplit(s, "/"; limit=2)
40
elements = map(e -> split(e, ":"; limit=2), split(elements[2:end-1], ","))
41
indices = map(v -> Base.parse(Int32, v[1]), elements)
src/vector.jl
struct Vector
vec::Base.Vector{Float32}
-function Base.parse(::Type{Vector}, s::String)
+function Base.parse(::Type{Vector}, pqv::LibPQ.PQBinaryValue{OID}) where {OID}
+ Vector(vec)
+function Base.parse(::Type{Vector}, pqv::LibPQ.PQTextValue{OID}) where {OID}
Vector(map(x -> Base.parse(Float32, x), split(s[2:end-1], ",")))
test/runtests.jl
@@ -10,6 +10,9 @@ Pgvector.register!(conn)
vec = columntable(execute(conn, "SELECT '[1,2,3]'::vector"))[1][1]
@test vec.vec == [1, 2, 3]
+ vec = columntable(execute(conn, "SELECT '[1,2,3]'::vector", binary_format=true))[1][1]
+ @test vec.vec == [1, 2, 3]
@testset "HalfVector" begin
@@ -18,6 +21,9 @@ end
vec = columntable(execute(conn, "SELECT '[1,2,3]'::halfvec"))[1][1]
+ vec = columntable(execute(conn, "SELECT '[1,2,3]'::halfvec", binary_format=true))[1][1]
@testset "SparseVector" begin
@@ -26,4 +32,7 @@ end
vec = columntable(execute(conn, "SELECT '{1:1,3:2,5:3}/6'::sparsevec"))[1][1]
@test vec.vec == sparsevec([1, 0, 2, 0, 3, 0])
+ vec = columntable(execute(conn, "SELECT '{1:1,3:2,5:3}/6'::sparsevec", binary_format=true))[1][1]
+ @test vec.vec == sparsevec([1, 0, 2, 0, 3, 0])
0 commit comments