Skip to content

Commit 94da7ae

Browse files
authored
Merge pull request #17 from henrik-m/fix-crash-on-functions-with-defaults
Fix crash on functions with defaults
2 parents bf818b4 + 3ebc712 commit 94da7ae

File tree

6 files changed

+50
-2
lines changed

6 files changed

+50
-2
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
namespace DynamicLinqPadPostgreSqlDriver.Tests.DynamicAssemblyGeneration
2+
{
3+
/// <summary>
4+
/// Test data for testing different signatures on pgsql functions
5+
/// </summary>
6+
public class InputParameterTestData
7+
{
8+
public string Name { get; }
9+
public string PgSqlType { get; }
10+
public object Default { get; }
11+
12+
public InputParameterTestData(string name, string pgSqlType, object defaultValue = null)
13+
{
14+
Name = name;
15+
PgSqlType = pgSqlType;
16+
Default = defaultValue;
17+
}
18+
}
19+
}

DynamicLinqPadPostgreSqlDriver.Tests/DynamicAssemblyGeneration/TestBase.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,19 @@ public void TestSimpleTypeArrayInputParameter<T>(string pgTypeName, T[] values)
6262
}
6363
}
6464

65+
public void TestInputParametersWithDefault(params InputParameterTestData[] testData)
66+
{
67+
var parameterDeclaration = string.Join(",", testData.Select(x => $"IN p_{x.Name} {x.PgSqlType}{(x.Default != null ? " DEFAULT " + x.Default : "")}"));
68+
var returnTableDeclaration = string.Join(",", testData.Select(x => $"{x.Name} {x.PgSqlType}"));
69+
var selectColumns = string.Join(",", testData.Select(x => $"p_{x.Name}"));
70+
71+
// This crashes with an NpgsqlException when the argument defaults are not handled separately. Npgsql seems to be unable to determine the type.
72+
ArrangeDataContext(db =>
73+
{
74+
DBConnection.Execute($"CREATE FUNCTION public.echo_params({parameterDeclaration}) RETURNS TABLE({returnTableDeclaration}) AS 'SELECT {selectColumns};' LANGUAGE SQL;");
75+
});
76+
}
77+
6578
public TypedDataContextBase ArrangeDataContext(Action<IDbConnection> prepareDatabase)
6679
{
6780
prepareDatabase(DBConnection);

DynamicLinqPadPostgreSqlDriver.Tests/DynamicAssemblyGeneration/TestPostgreSqlFunctions.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,5 +148,20 @@ public void TestReturnJson()
148148
dynamic record = result[0];
149149
Assert.Equal("[[1,5],[99,100]]", record.get_json);
150150
}
151+
152+
[Fact]
153+
public void TestSimpleParameterWithDefault()
154+
{
155+
TestInputParametersWithDefault(new InputParameterTestData("id", "integer", 0));
156+
}
157+
158+
[Fact]
159+
public void TestMultipleParametersWithDefault()
160+
{
161+
TestInputParametersWithDefault(
162+
new InputParameterTestData("txt", "text", "'comma,separated,text'"),
163+
new InputParameterTestData("id", "integer", 0),
164+
new InputParameterTestData("arr", "int[]", "'{1,2}'"));
165+
}
151166
}
152167
}

DynamicLinqPadPostgreSqlDriver.Tests/DynamicLinqPadPostgreSqlDriver.Tests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@
8888
</ItemGroup>
8989
<ItemGroup>
9090
<Compile Include="DynamicAssemblyGeneration\DatabaseFixture.cs" />
91+
<Compile Include="DynamicAssemblyGeneration\InputParameterTestData.cs" />
9192
<Compile Include="DynamicAssemblyGeneration\TestBase.cs" />
9293
<Compile Include="DynamicAssemblyGeneration\TestPostgreSqlFunctions.cs" />
9394
<Compile Include="TestAdvancedTypeMappings.cs" />

DynamicLinqPadPostgreSqlDriver/FunctionData.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ internal class FunctionData
77
public int ArgumentCount { get; set; }
88
public string[] ArgumentNames { get; set; }
99
public int[] ArgumentTypeOids { get; set; }
10-
public object[] ArgumentDefaults { get; set; }
10+
public string ArgumentDefaults { get; set; }
1111
public bool IsMultiValueReturn { get; set; }
1212
}
1313
}

DynamicLinqPadPostgreSqlDriver/SQL/QueryFunctions.sql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
, pronargs AS "ArgumentCount"
55
, proargnames AS "ArgumentNames"
66
, proargtypes AS "ArgumentTypeOids"
7-
, proargdefaults AS "ArgumentDefaults"
7+
, pg_get_expr(proargdefaults, 0) AS "ArgumentDefaults"
88
, proretset AS "IsMultiValueReturn"
99
from
1010
pg_proc

0 commit comments

Comments
 (0)