Skip to content

Commit 009663a

Browse files
Fix error ORA-01795: maximum number of expressions in a list is 1000 error (#697)
Split list of items on IN expression for Oracle SQLs.
1 parent 924f658 commit 009663a

File tree

2 files changed

+86
-11
lines changed

2 files changed

+86
-11
lines changed

dotnet/src/dotnetframework/GxClasses/Data/GXDataCommon.cs

Lines changed: 85 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
using System.Globalization;
2626
using GeneXus.Metadata;
2727
using System.Data.Common;
28+
using System.Linq;
2829

2930
namespace GeneXus.Data
3031
{
@@ -140,6 +141,7 @@ IDataReader GetDataReader(IGxConnectionManager connManager, IGxConnection connec
140141
void SetCursorDef(CursorDef cursorDef);
141142
string ConcatOp(int pos);
142143
string AfterCreateCommand(string stmt, GxParameterCollection parmBinds);
144+
int MaxNumberOfValuesInList { get; }
143145
}
144146

145147

@@ -945,6 +947,9 @@ public virtual string DataSource
945947
get {return m_datasource;}
946948
set{m_datasource=value;}
947949
}
950+
951+
public virtual int MaxNumberOfValuesInList => int.MaxValue;
952+
948953
public string ConnectionStringForLog()
949954
{
950955
string result="";
@@ -3705,6 +3710,76 @@ public GxDbmsUtils(IGxDataRecord db)
37053710
{
37063711
dbmsHandler = db;
37073712
}
3713+
IEnumerable<IEnumerable<T>> Split<T>(T[] arr, int size)
3714+
{
3715+
for (int i = 0; i < arr.Length / size + 1; i++)
3716+
{
3717+
yield return arr.Skip(i * size).Take(size);
3718+
}
3719+
}
3720+
IEnumerable<IList> Split(IList values, int size)
3721+
{
3722+
IList list = new List<object>(size);
3723+
3724+
foreach (object item in values)
3725+
{
3726+
list.Add(item);
3727+
if (list.Count == size)
3728+
{
3729+
yield return list;
3730+
list = new List<object>(size);
3731+
}
3732+
}
3733+
if (list.Count != 0)
3734+
{
3735+
yield return list;
3736+
}
3737+
}
3738+
string ChunkValueList<T>(T[] values, string prefix, string postfix)
3739+
{
3740+
StringBuilder stringBuilder = new StringBuilder();
3741+
if (values.Length > dbmsHandler.MaxNumberOfValuesInList)
3742+
{
3743+
foreach (T[] svalues in Split(values, dbmsHandler.MaxNumberOfValuesInList))
3744+
{
3745+
if (stringBuilder.Length > 0)
3746+
stringBuilder.Append(" OR ");
3747+
stringBuilder.Append(prefix);
3748+
stringBuilder.Append(ValueList(svalues));
3749+
stringBuilder.Append(postfix);
3750+
}
3751+
}
3752+
else
3753+
{
3754+
stringBuilder.Append(prefix);
3755+
stringBuilder.Append(ValueList(values));
3756+
stringBuilder.Append(postfix);
3757+
}
3758+
return stringBuilder.ToString();
3759+
}
3760+
string ChunkValueList(IList values, string prefix, string postfix)
3761+
{
3762+
StringBuilder stringBuilder = new StringBuilder();
3763+
if (values.Count > dbmsHandler.MaxNumberOfValuesInList)
3764+
{
3765+
foreach (IList svalues in Split(values, dbmsHandler.MaxNumberOfValuesInList))
3766+
{
3767+
if (stringBuilder.Length > 0)
3768+
stringBuilder.Append(" OR ");
3769+
stringBuilder.Append(prefix);
3770+
stringBuilder.Append(ValueList(svalues));
3771+
stringBuilder.Append(postfix);
3772+
}
3773+
}
3774+
else
3775+
{
3776+
stringBuilder.Append(prefix);
3777+
stringBuilder.Append(ValueList(values));
3778+
stringBuilder.Append(postfix);
3779+
3780+
}
3781+
return stringBuilder.ToString();
3782+
}
37083783
public string ValueList(short[] Values, string Prefix, string Postfix)
37093784
{
37103785
if (Values == null || Values.Length == 0)
@@ -3713,7 +3788,7 @@ public string ValueList(short[] Values, string Prefix, string Postfix)
37133788
}
37143789
else
37153790
{
3716-
return Prefix + ValueList(Values) + Postfix;
3791+
return ChunkValueList(Values, Prefix, Postfix);
37173792
}
37183793
}
37193794
public string ValueList(int[] Values, string Prefix, string Postfix)
@@ -3724,7 +3799,7 @@ public string ValueList(int[] Values, string Prefix, string Postfix)
37243799
}
37253800
else
37263801
{
3727-
return Prefix + ValueList(Values) + Postfix;
3802+
return ChunkValueList(Values, Prefix, Postfix);
37283803
}
37293804
}
37303805
public string ValueList(long[] Values, string Prefix, string Postfix)
@@ -3735,7 +3810,7 @@ public string ValueList(long[] Values, string Prefix, string Postfix)
37353810
}
37363811
else
37373812
{
3738-
return Prefix + ValueList(Values) + Postfix;
3813+
return ChunkValueList(Values, Prefix, Postfix);
37393814
}
37403815
}
37413816
public string ValueList(decimal[] Values, string Prefix, string Postfix)
@@ -3746,7 +3821,7 @@ public string ValueList(decimal[] Values, string Prefix, string Postfix)
37463821
}
37473822
else
37483823
{
3749-
return Prefix + ValueList(Values) + Postfix;
3824+
return ChunkValueList(Values, Prefix, Postfix);
37503825
}
37513826
}
37523827
public string ValueList(float[] Values, string Prefix, string Postfix)
@@ -3757,7 +3832,7 @@ public string ValueList(float[] Values, string Prefix, string Postfix)
37573832
}
37583833
else
37593834
{
3760-
return Prefix + ValueList(Values) + Postfix;
3835+
return ChunkValueList(Values, Prefix, Postfix);
37613836
}
37623837
}
37633838
public string ValueList(double[] Values, string Prefix, string Postfix)
@@ -3768,7 +3843,7 @@ public string ValueList(double[] Values, string Prefix, string Postfix)
37683843
}
37693844
else
37703845
{
3771-
return Prefix + ValueList(Values) + Postfix;
3846+
return ChunkValueList(Values, Prefix, Postfix);
37723847
}
37733848
}
37743849
public string ValueList(DateTime[] Values, string Prefix, string Postfix)
@@ -3779,7 +3854,7 @@ public string ValueList(DateTime[] Values, string Prefix, string Postfix)
37793854
}
37803855
else
37813856
{
3782-
return Prefix + ValueList(Values) + Postfix;
3857+
return ChunkValueList(Values, Prefix, Postfix);
37833858
}
37843859
}
37853860
public string ValueList(string[] Values, string Prefix, string Postfix)
@@ -3790,7 +3865,7 @@ public string ValueList(string[] Values, string Prefix, string Postfix)
37903865
}
37913866
else
37923867
{
3793-
return Prefix + ValueList(Values) + Postfix;
3868+
return ChunkValueList(Values, Prefix, Postfix);
37943869
}
37953870
}
37963871
public string ValueList(bool[] Values, string Prefix, string Postfix)
@@ -3801,7 +3876,7 @@ public string ValueList(bool[] Values, string Prefix, string Postfix)
38013876
}
38023877
else
38033878
{
3804-
return Prefix + ValueList(Values) + Postfix;
3879+
return ChunkValueList(Values, Prefix, Postfix);
38053880
}
38063881
}
38073882
public string ValueList(IList Values, string Prefix, string Postfix)
@@ -3812,7 +3887,7 @@ public string ValueList(IList Values, string Prefix, string Postfix)
38123887
}
38133888
else
38143889
{
3815-
return Prefix + ValueList(Values) + Postfix;
3890+
return ChunkValueList(Values, Prefix, Postfix);
38163891
}
38173892
}
38183893
public string ValueList(short[] Values)

dotnet/src/dotnetframework/GxClasses/Data/GXDataOracle.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -961,7 +961,7 @@ public override IGeographicNative GetGeospatial(IGxDbCommand cmd, IDataRecord DR
961961
return gtmp;
962962
}
963963
}
964-
964+
public override int MaxNumberOfValuesInList => 1000;
965965
public override bool AllowsDuplicateParameters
966966
{
967967
get

0 commit comments

Comments
 (0)