Skip to content

Commit 8f726a6

Browse files
authored
make sure getindex on DataFrameRows does not alias passed selector (#3192)
1 parent 897a8cb commit 8f726a6

File tree

4 files changed

+36
-2
lines changed

4 files changed

+36
-2
lines changed

NEWS.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
1+
# DataFrames.jl v1.4.1 Patch Release Notes
2+
3+
## Bug fixes
4+
5+
* Make sure we always copy the indexing value when calling `getindex` on
6+
`DataFrameRows` object
7+
([#3192](https://github.com/JuliaData/DataFrames.jl/issues/3192))
8+
19
# DataFrames.jl v1.4 Release Notes
210

311
## Julia compatibility change

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name = "DataFrames"
22
uuid = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0"
3-
version = "1.4.0"
3+
version = "1.4.1"
44

55
[deps]
66
Compat = "34da2185-b29b-5c13-b0c7-acf172513d20"

src/abstractdataframe/iteration.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ Base.size(itr::DataFrameRows) = (size(parent(itr), 1), )
7979

8080
Base.@propagate_inbounds Base.getindex(itr::DataFrameRows, i::Int) = parent(itr)[i, :]
8181
Base.@propagate_inbounds Base.getindex(itr::DataFrameRows, idx) =
82-
eachrow(@view parent(itr)[idx, :])
82+
eachrow(@view parent(itr)[idx isa AbstractVector && !(eltype(idx) <: Bool) ? copy(idx) : idx, :])
8383

8484
# separate methods are needed due to dispatch ambiguity
8585
Base.getproperty(itr::DataFrameRows, col_ind::Symbol) =

test/iteration.jl

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,4 +223,30 @@ end
223223
@test er2 == er[1:2]
224224
end
225225

226+
@testset "test unaliasing of index" begin
227+
for idx in ([2, 3], [0x2, 0x3], 2:3, Not([1, 4]),
228+
[false, true, true, false], big.([2, 3]), big.(2:3), :)
229+
df = DataFrame(a=1:4)
230+
er = eachrow(df)
231+
er2 = er[idx]
232+
len = length(er2)
233+
@test len == (idx === Colon() ? 4 : 2)
234+
p = parent(er2)
235+
@test p isa SubDataFrame
236+
@test parentindices(p)[1] == (1:4)[idx]
237+
if !(idx isa UnitRange)
238+
@test parentindices(p)[1] !== idx
239+
end
240+
if idx isa Vector
241+
empty!(idx)
242+
end
243+
@test length(er2) == len
244+
245+
er3 = filter(x -> x.a <= 2, er)
246+
@test length(er3) == 2
247+
@test parent(er3) isa SubDataFrame
248+
@test parentindices(parent(er3))[1] == 1:2
249+
end
250+
end
251+
226252
end # module

0 commit comments

Comments
 (0)