# Strange problem with ruby-dbi and arrays

**URL:** <https://www.ruby-forum.com/t/strange-problem-with-ruby-dbi-and-arrays/65107>\
**Category:** Ruby\
**Created:** [August 16, 2006, 7:01am UTC](https://www.ruby-forum.com/t/strange-problem-with-ruby-dbi-and-arrays/65107 "2006-08-16T07:01:35Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![snacktime](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/7feea3/32.png) [@snacktime](https://www.ruby-forum.com/u/snacktime)\
**Post date:** [August 16, 2006, 7:01am UTC](https://www.ruby-forum.com/t/strange-problem-with-ruby-dbi-and-arrays/65107/1 "2006-08-16T07:01:35Z")

</div>

No clue what I am doing wrong here. It’s hard to give a complete test  
case because it involves a database but maybe someone can spot what  
I’m doing wrong. with each fetch, tlist is growing by one, but all  
the elements in tlist get set to the last value of row. I put sample  
output from the script at the end.

require ‘dbi’  
conn = DBI.connect(blah blah)

tlist = []  
sth = conn.prepare(“SELECT sequence\_number from vital\_transact where  
merchant\_id = ?”)  
sth.execute(‘poi2’)  
while row = sth.fetch do  
tlist \<\< row  
p “tlist=#{tlist.length} row=#{row.length}”  
p tlist  
p row  
end  
sth.finish  
p “”  
p tlist

“tlist=1 row=1”  
[“0012”]  
[[“0012”]]  
“tlist=2 row=1”  
[“0013”]  
[[“0013”], [“0013”]]  
“tlist=3 row=1”  
[“0014”]  
[[“0014”], [“0014”], [“0014”]]  
“tlist=4 row=1”  
[“0015”]  
[[“0015”], [“0015”], [“0015”], [“0015”]]  
“tlist=5 row=1”  
[“0019”]  
[[“0019”], [“0019”], [“0019”], [“0019”], [“0019”]]  
“tlist=6 row=1”  
[“0021”]  
[[“0021”], [“0021”], [“0021”], [“0021”], [“0021”], [“0021”]]  
“tlist=7 row=1”  
[“0022”]  
[[“0022”], [“0022”], [“0022”], [“0022”], [“0022”], [“0022”], [“0022”]]  
“tlist=8 row=1”  
[“0023”]  
[[“0023”], [“0023”], [“0023”], [“0023”], [“0023”], [“0023”], [“0023”],  
[“0023”]]  
“tlist=9 row=1”  
[“0024”]  
[[“0024”], [“0024”], [“0024”], [“0024”], [“0024”], [“0024”], [“0024”],  
[“0024”], [“0024”]]  
“”  
[[“0024”], [“0024”], [“0024”], [“0024”], [“0024”], [“0024”], [“0024”],  
[“0024”], [“0024”]]

---

<div class="post-metadata">

**Author:** ![snacktime](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/7feea3/32.png) [@snacktime](https://www.ruby-forum.com/u/snacktime)\
**Post date:** [August 16, 2006, 7:13am UTC](https://www.ruby-forum.com/t/strange-problem-with-ruby-dbi-and-arrays/65107/2 "2006-08-16T07:13:35Z")

</div>

Hmm, if I change:  
tlist \<\< row

to  
tlist.concat(row)

Then it works. Why is that?

---

<div class="post-metadata">

**Author:** ![snacktime](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/7feea3/32.png) [@snacktime](https://www.ruby-forum.com/u/snacktime)\
**Post date:** [August 16, 2006, 7:16am UTC](https://www.ruby-forum.com/t/strange-problem-with-ruby-dbi-and-arrays/65107/3 "2006-08-16T07:16:35Z")

</div>

Never mind, that doesn’t work it flattens row before appending it.

---

<div class="post-metadata">

**Author:** ![snacktime](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/7feea3/32.png) [@snacktime](https://www.ruby-forum.com/u/snacktime)\
**Post date:** [August 16, 2006, 7:28am UTC](https://www.ruby-forum.com/t/strange-problem-with-ruby-dbi-and-arrays/65107/4 "2006-08-16T07:28:36Z")

</div>

Ok I get it now. Each element I append onto tlist still references  
row, so each time through the loop, all the row elements in tlist get  
set to the current value of row. The following works.

r = row.to\_a.clone  
tlist \<\< r

---

<div class="post-metadata">

**Author:** ![snacktime](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/7feea3/32.png) [@snacktime](https://www.ruby-forum.com/u/snacktime)\
**Post date:** [August 16, 2006, 7:22am UTC](https://www.ruby-forum.com/t/strange-problem-with-ruby-dbi-and-arrays/65107/5 "2006-08-16T07:22:36Z")

</div>

On Aug 16, 2006, at 1:12 AM, snacktime wrote:

> Hmm, if I change:  
> tlist \<\< row
> 
> to  
> tlist.concat(row)
> 
> Then it works. Why is that?

Guessing but perhaps fetch reuses the same object to store the query  
result.  
What if you do

while row = sth.fetch.dup do  
…  
end

---

<div class="post-metadata">

**Author:** ![snacktime](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/7feea3/32.png) [@snacktime](https://www.ruby-forum.com/u/snacktime)\
**Post date:** [August 16, 2006, 7:31am UTC](https://www.ruby-forum.com/t/strange-problem-with-ruby-dbi-and-arrays/65107/6 "2006-08-16T07:31:36Z")

</div>

Sort of works. On the last loop it throws this:

`dup’: can’t dup NilClass (TypeError)
