Skip to content

Commit 101a0bd

Browse files
authored
Revert "Microsoft.Data.Sqlite.Core issue with multiple Blob colums (#32770)" (#32945)
This reverts commit 9e69b85.
1 parent 7cae3c3 commit 101a0bd

File tree

2 files changed

+9
-63
lines changed

2 files changed

+9
-63
lines changed

src/Microsoft.Data.Sqlite.Core/SqliteDataRecord.cs

Lines changed: 9 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -14,30 +14,16 @@
1414

1515
namespace Microsoft.Data.Sqlite
1616
{
17-
1817
internal class SqliteDataRecord : SqliteValueReader, IDisposable
1918
{
20-
internal class RowIdInfo
21-
{
22-
public int Ordinal { get; set; }
23-
public string TableName { get; set; }
24-
25-
public RowIdInfo(int ordinal, string tableName)
26-
{
27-
Ordinal = ordinal;
28-
TableName = tableName;
29-
}
30-
}
31-
3219
private readonly SqliteConnection _connection;
3320
private readonly Action<int> _addChanges;
3421
private byte[][]? _blobCache;
3522
private int?[]? _typeCache;
3623
private Dictionary<string, int>? _columnNameOrdinalCache;
3724
private string[]? _columnNameCache;
3825
private bool _stepped;
39-
readonly Dictionary<string, RowIdInfo> RowIds = new Dictionary<string, RowIdInfo>();
40-
26+
private int? _rowidOrdinal;
4127
private bool _alreadyThrown;
4228
private bool _alreadyAddedChanges;
4329

@@ -324,11 +310,11 @@ public virtual Stream GetStream(int ordinal)
324310
var blobDatabaseName = sqlite3_column_database_name(Handle, ordinal).utf8_to_string();
325311
var blobTableName = sqlite3_column_table_name(Handle, ordinal).utf8_to_string();
326312

327-
RowIdInfo? rowIdForOrdinal = null;
328-
string rowidkey = $"{blobDatabaseName}_{blobTableName}";
329-
if (!RowIds.TryGetValue(rowidkey, out rowIdForOrdinal))
313+
if (!_rowidOrdinal.HasValue)
330314
{
315+
_rowidOrdinal = -1;
331316
var pkColumns = -1L;
317+
332318
for (var i = 0; i < FieldCount; i++)
333319
{
334320
if (i == ordinal)
@@ -351,8 +337,7 @@ public virtual Stream GetStream(int ordinal)
351337
var columnName = sqlite3_column_origin_name(Handle, i).utf8_to_string();
352338
if (columnName == "rowid")
353339
{
354-
rowIdForOrdinal = new RowIdInfo(i, tableName);
355-
RowIds.Add(rowidkey, rowIdForOrdinal);
340+
_rowidOrdinal = i;
356341
break;
357342
}
358343

@@ -383,23 +368,22 @@ public virtual Stream GetStream(int ordinal)
383368

384369
if (pkColumns == 1L)
385370
{
386-
rowIdForOrdinal = new RowIdInfo(i, tableName);
387-
RowIds.Add(rowidkey, rowIdForOrdinal);
371+
_rowidOrdinal = i;
388372
break;
389373
}
390374
}
391375
}
392376

393-
Debug.Assert(rowIdForOrdinal!=null);
377+
Debug.Assert(_rowidOrdinal.HasValue);
394378
}
395379

396-
if (rowIdForOrdinal == null)
380+
if (_rowidOrdinal.Value < 0)
397381
{
398382
return new MemoryStream(GetCachedBlob(ordinal), false);
399383
}
400384

401385
var blobColumnName = sqlite3_column_origin_name(Handle, ordinal).utf8_to_string();
402-
var rowid = GetInt64(rowIdForOrdinal.Ordinal);
386+
var rowid = GetInt64(_rowidOrdinal.Value);
403387

404388
return new SqliteBlob(_connection, blobDatabaseName, blobTableName, blobColumnName, rowid, readOnly: true);
405389
}

test/Microsoft.Data.Sqlite.Tests/SqliteDataReaderTest.cs

Lines changed: 0 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -145,44 +145,6 @@ public void GetBytes_works_streaming()
145145
}
146146
}
147147

148-
[Fact]
149-
public void GetBytes_works_streaming_join()
150-
{
151-
using (var connection = new SqliteConnection("Data Source=:memory:"))
152-
{
153-
connection.Open();
154-
155-
connection.ExecuteNonQuery("CREATE TABLE A (ID INTEGER PRIMARY KEY,VALUE BLOB); INSERT INTO A (ID, VALUE) VALUES (1,x'01020304');");
156-
connection.ExecuteNonQuery("CREATE TABLE B (ID INTEGER PRIMARY KEY,FATHER_ID INTEGER NOT NULL,VALUE BLOB); INSERT INTO B (ID,FATHER_ID, VALUE) VALUES (1000,1,x'05060708');");
157-
158-
using (var reader = connection.ExecuteReader(@"SELECT
159-
A.ID as AID,
160-
A.VALUE as AVALUE,
161-
B.ID as BID,
162-
B.VALUE as BVALUE
163-
FROM
164-
A JOIN B
165-
ON B.FATHER_ID=A.ID "))
166-
{
167-
var hasData = reader.Read();
168-
Assert.True(hasData);
169-
170-
//reading fields that does not involve blobs should be ok
171-
Console.WriteLine($"A.ID={reader.GetInt32(0)} B.ID={reader.GetInt32(2)}");
172-
173-
//get len of abuff
174-
var abuff = new byte[2];
175-
reader.GetBytes(1, 1, abuff, 0, abuff.Length);
176-
Assert.Equal([0x02, 0x03], abuff);
177-
178-
var bbuff = new byte[2];
179-
reader.GetBytes(3, 1, bbuff, 0, bbuff.Length); //this was failing. now should be fixed
180-
Assert.Equal([0x06, 0x07], bbuff);
181-
182-
}
183-
}
184-
}
185-
186148
[Fact]
187149
public void GetBytes_NullBuffer()
188150
{

0 commit comments

Comments
 (0)