Cast of string values to VARCHAR(8191) results in "Implementation limit
exceeded"
---------------------------------------------------------------------------------
Key: DNET-934
URL: http://tracker.firebirdsql.org/browse/DNET-934
Project: .NET Data provider
Issue Type: Bug
Components: Entity Framework
Affects Versions: 7.5.0.0
Reporter: Daniel Richter
Assignee: Jiri Cincura
For string values in queries, the generated SQL results in CASTs to
VARCHAR(8191)
dataContext.Articles.Select(_ => new { A1 = "1A", A2 = "2A" })
generates SQL such as
SELECT CAST(_UTF8'1A' AS VARCHAR(8191)) AS "A1", CAST(_UTF8'2A' AS
VARCHAR(8191)) AS "A2" FROM "ARTICLE"
In case the string value is used in multiple* columns, the SQL command
execution results in an error "SQL error code = -204, Implementation limit
exceeded, block size exceeds implementation restriction".
*) With charset UTF8 the query fails with 2+ columns using string values. The
amount of string values used in the column does not seem to affect the outcome
(50+ string values in one column still work).
With charset WIN1252 the query fails with 8+ columns using one string value.
Using multiple string values in a column shows different results; in some
cases, 8+ string values used in the entire query fails, in some cases not.
It does not matter whether the string value is used inline or as a captured
variable (the cast is also inserted for those).
Because of the following code in SqlGenerator.cs, Visit(DbConstantExpression)
// constant is always considered Unicode
isUnicode = true;
var length =
MetadataHelpers.GetFacetValueOrDefault<int?>(e.ResultType,MetadataHelpers.MaxLengthFacetName,null)
?? (isUnicode ? FbProviderManifest.UnicodeVarcharMaxSize :
FbProviderManifest.AsciiVarcharMaxSize);
The length will result in FbProviderManifest.UnicodeVarcharMaxSize (8191).
Is the CAST to VARCHAR(n) really necessary? The following two solutions will
work without problems (so far) for my use-case:
1) Don't pass the explicitLength parameter to FormatString (SqlGenerator.cs),
so the length of the string value will be used:
SELECT CAST(_UTF8'ABC' AS VARCHAR(3)) AS "A1", CAST(_UTF8'DEFGH' AS
VARCHAR(5)) AS "A2" FROM "ARTICLE"
2) Omit the CAST entirely.
SELECT _UTF8'ABC' AS "A1", _UTF8'DEFGH' AS "A2" FROM "ARTICLE"
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://tracker.firebirdsql.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
_______________________________________________
Firebird-net-provider mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/firebird-net-provider