Skip to content

Commit

Permalink
FIXES ISSUE #466 - string parameter size throws in oracle when string…
Browse files Browse the repository at this point in the history
… longer than 4000 unicode characters
  • Loading branch information
jonwagner committed Oct 24, 2021
1 parent e250ef4 commit 112811f
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 20 deletions.
22 changes: 2 additions & 20 deletions Insight.Database.Core/CodeGenerator/DbParameterGenerator.cs
Expand Up @@ -529,32 +529,14 @@ private static void SetParameterStringValue(IDbDataParameter parameter, object v

/// <summary>
/// Calculate the length to set a string parameter to.
/// Text commmands should be set to max length or -1 to allow query plan caching.
/// </summary>
/// <param name="s">The string to evaluate.</param>
/// <param name="commandType">The type of command being processed.</param>
/// <param name="parameterType">The type of the parameter being processed.</param>
private static int GetStringParameterLength(String s, CommandType commandType, DbType parameterType)
{
int maxLen = -1;
switch (parameterType)
{
case DbType.StringFixedLength:
case DbType.String:
maxLen = 4000;
break;

case DbType.AnsiString:
case DbType.AnsiStringFixedLength:
maxLen = 8000;
break;
}

int length = s?.Length ?? 0;
if (length > maxLen)
return -1;

return maxLen;
// we never want to truncate the input or output parameter lengths.
return int.MaxValue;
}
#endregion

Expand Down
17 changes: 17 additions & 0 deletions Insight.Tests.OracleManaged.Core/OracleTests.cs
Expand Up @@ -286,6 +286,23 @@ public void TestBindByNameWithWrappedConnection()

var result = wrapped.QuerySql<dynamic>(sql, args);
result = wrapped.QuerySql<dynamic>(sql, args);
}

[Test]
public void TestIssue464()
{
try
{
var testString = new String('z', 16 * 1024);
_connection.ExecuteSql("CREATE TABLE chunks (data clob)");
_connection.ExecuteSql("INSERT INTO chunks (data) VALUES (:data)", new { data = testString });
var result = _connection.ExecuteScalarSql<string>("SELECT data FROM chunks");
Assert.AreEqual(result, testString);
}
finally
{
_connection.ExecuteSql("DROP TABLE chunks");
}
}
}
}
17 changes: 17 additions & 0 deletions Insight.Tests.OracleManaged/OracleTests.cs
Expand Up @@ -287,5 +287,22 @@ public void TestBindByNameWithWrappedConnection()
var result = wrapped.QuerySql<dynamic>(sql, args);
result = wrapped.QuerySql<dynamic>(sql, args);
}

[Test]
public void TestIssue464()
{
try
{
var testString = new String('z', 16 * 1024);
_connection.ExecuteSql("CREATE TABLE chunks (data clob)");
_connection.ExecuteSql("INSERT INTO chunks (data) VALUES (:data)", new { data = testString });
var result = _connection.ExecuteScalarSql<string>("SELECT data FROM chunks");
Assert.AreEqual(result, testString);
}
finally
{
_connection.ExecuteSql("DROP TABLE chunks");
}
}
}
}

0 comments on commit 112811f

Please sign in to comment.