Skip to content

Commit 11f0855

Browse files
committed
Add RawSQL type to compiler and unsafe_inject_raw erased function.
1 parent 0fa30cb commit 11f0855

7 files changed

Lines changed: 36 additions & 18 deletions

File tree

src/Rezoom.SQL.Compiler/DefaultFunctions.fs

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,4 @@
11
module Rezoom.SQL.Compiler.DefaultFunctions
2-
open System
3-
open System.Data
4-
open System.Collections.Generic
5-
open System.Globalization
6-
open Rezoom.SQL
7-
open Rezoom.SQL.Mapping
8-
open Rezoom.SQL.Compiler.BackendUtilities
9-
open Rezoom.SQL.Compiler.Translators
102
open Rezoom.SQL.Compiler.FunctionDeclarations
113

124
/// Functions that are supported by EVERY database. Surprisingly there aren't many of these.
@@ -27,6 +19,7 @@ let builtins =
2719
// Ignore the inferred type (but not inferred nullability) of its argument.
2820
// Lets you override the typechecker and treat values like whatever you feel they should be.
2921
erased "unsafe_coerce" (infect scalar) scalar
22+
erased "unsafe_inject_raw" rawsql any
3023
|]
3124

3225
let extendedBy backendFunctions =

src/Rezoom.SQL.Compiler/FunctionDeclarations.fs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ let inline private concrete ty =
3636
VarArg = None
3737
}
3838

39+
let any = concrete AnyTypeClass
3940
let scalar = concrete ScalarTypeClass
4041
let boolean = concrete BooleanType
4142
let string = concrete StringType
@@ -53,6 +54,7 @@ let datetimeoffset = concrete DateTimeOffsetType
5354
let datetimey = concrete DateTimeishTypeClass
5455
let decimal = concrete DecimalType
5556
let guid = concrete GuidType
57+
let rawsql = concrete RawSQLType
5658

5759
let nullable arg =
5860
{ arg with

src/Rezoom.SQL.Compiler/TypeSystem.fs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
namespace Rezoom.SQL.Compiler
22
open System
33
open System.Data
4-
open System.Data.Common
54
open System.Collections.Generic
5+
open Rezoom.SQL.Mapping
66

77
type CoreColumnType =
88
| BooleanType
@@ -22,6 +22,7 @@ type CoreColumnType =
2222
| ScalarTypeClass
2323
| AnyTypeClass
2424
| ListType of CoreColumnType
25+
| RawSQLType
2526
member this.ParentType =
2627
match this with
2728
| IntegerType Integer16 -> IntegralTypeClass
@@ -42,6 +43,7 @@ type CoreColumnType =
4243
| NumericTypeClass
4344
| StringishTypeClass -> ScalarTypeClass
4445
| ScalarTypeClass
46+
| RawSQLType
4547
| AnyTypeClass -> AnyTypeClass
4648
| ListType element ->
4749
let elementParent = element.ParentType
@@ -80,6 +82,7 @@ type CoreColumnType =
8082
| StringishTypeClass -> "<stringish>"
8183
| ScalarTypeClass -> "<scalar>"
8284
| AnyTypeClass -> "<any>"
85+
| RawSQLType -> "<rawsql>"
8386
| ListType t -> "[" + string t + "]"
8487
member this.ApproximateTypeName() =
8588
match this with
@@ -89,6 +92,7 @@ type CoreColumnType =
8992
| ScalarTypeClass
9093
| AnyTypeClass
9194
| ListType _
95+
| RawSQLType
9296
| StringType -> StringTypeName(None)
9397
| IntegerType Integer16 -> IntegerTypeName Integer16
9498
| IntegerType Integer32 -> IntegerTypeName Integer32
@@ -154,6 +158,9 @@ type ColumnType =
154158
| ListType t ->
155159
let dbType, clrType = { Type = t; Nullable = ty.Nullable }.TypeInfo(useOptional)
156160
dbType, clrType.MakeArrayType()
161+
| RawSQLType ->
162+
// DbType part is not really used here
163+
Unchecked.defaultof<DbType>, typeof<CommandFragment array>
157164
member ty.CLRType(useOptional) = snd <| ty.TypeInfo(useOptional)
158165
member ty.DbType = fst <| ty.TypeInfo(false)
159166
override ty.ToString() =

src/Rezoom.SQL.Mapping/CommandParts.fs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ type CommandCategory = CommandCategory of connectionName : string
9191
type CommandParameter =
9292
| ListParameter of DbType * Array
9393
| ScalarParameter of DbType * obj
94-
| RawSQLParameter of CommandFragment list
94+
| RawSQLParameter of CommandFragment array
9595
member this.Equals(other : CommandParameter) =
9696
match this, other with
9797
| ListParameter (ty1, arr1), ListParameter (ty2, arr2) ->

src/Rezoom.SQL.Provider/TypeGeneration.fs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,8 @@ let private generateCommandMethod
225225
let arr =
226226
<@@ [| for ex in ((%%inputArr) : Array) -> ((%%lambda) : obj -> obj) ex |] @@>
227227
<@@ ListParameter(%%dbType, %%Expr.Coerce(arr, typeof<Array>)) @@>
228+
| RawSQLType ->
229+
<@@ RawSQLParameter %%ex @@>
228230
| _ ->
229231
let tx = backend.ParameterTransform(ty)
230232
let dbType = Quotations.Expr.Value(tx.ParameterType)

src/TypeProviderUsers/TypeProviderUser.Postgres/TestSelects.fs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ select * from Users where Created > @created
5050

5151
[<Test>]
5252
let ``test datetime parameter`` () =
53-
let results = TestDateTimeParameter.Command(DateTime.UtcNow)
53+
let results = TestDateTimeParameter.Command(DateTime.UtcNow) |> runOnTestData
5454
printfn "%A" results
5555

5656
type TestOptionalDateTimeParameter = SQL<"""
@@ -59,7 +59,7 @@ select * from Users where Created > @created or @created is null
5959

6060
[<Test>]
6161
let ``test optional datetime parameter`` () =
62-
let results = TestOptionalDateTimeParameter.Command(Some DateTime.UtcNow)
62+
let results = TestOptionalDateTimeParameter.Command(Some DateTime.UtcNow) |> runOnTestData
6363
printfn "%A" results
6464

6565
type TestGuidParameter = SQL<"""
@@ -70,7 +70,7 @@ drop table temp.bar;
7070

7171
[<Test>]
7272
let ``test guid parameter`` () =
73-
let results = TestGuidParameter.Command(Guid.NewGuid())
73+
let results = TestGuidParameter.Command(Guid.NewGuid()) |> runOnTestData
7474
printfn "%A" results
7575

7676
type TestOptionalGuidParameter = SQL<"""
@@ -79,7 +79,7 @@ select * from Users where RandomId = @id or @id is null
7979

8080
[<Test>]
8181
let ``test optional guid parameter`` () =
82-
let results = TestOptionalGuidParameter.Command(Some (Guid.NewGuid()))
82+
let results = TestOptionalGuidParameter.Command(Some (Guid.NewGuid())) |> runOnTestData
8383
printfn "%A" results
8484

8585

src/TypeProviderUsers/TypeProviderUser.SQLite/TestSelects.fs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ select * from Users where Created > @created
5151

5252
[<Test>]
5353
let ``test datetime parameter`` () =
54-
let results = TestDateTimeParameter.Command(DateTime.UtcNow)
54+
let results = TestDateTimeParameter.Command(DateTime.UtcNow) |> runOnTestData
5555
printfn "%A" results
5656

5757
type TestOptionalDateTimeParameter = SQL<"""
@@ -60,7 +60,7 @@ select * from Users where Created > @created or @created is null
6060

6161
[<Test>]
6262
let ``test optional datetime parameter`` () =
63-
let results = TestOptionalDateTimeParameter.Command(Some DateTime.UtcNow)
63+
let results = TestOptionalDateTimeParameter.Command(Some DateTime.UtcNow) |> runOnTestData
6464
printfn "%A" results
6565

6666
type TestGuidParameter = SQL<"""
@@ -71,7 +71,7 @@ drop table temp.bar;
7171

7272
[<Test>]
7373
let ``test guid parameter`` () =
74-
let results = TestGuidParameter.Command(Guid.NewGuid())
74+
let results = TestGuidParameter.Command(Guid.NewGuid()) |> runOnTestData
7575
printfn "%A" results
7676

7777
type TestOptionalGuidParameter = SQL<"""
@@ -80,7 +80,7 @@ select * from Users where RandomId = @id or @id is null
8080

8181
[<Test>]
8282
let ``test optional guid parameter`` () =
83-
let results = TestOptionalGuidParameter.Command(Some (Guid.NewGuid()))
83+
let results = TestOptionalGuidParameter.Command(Some (Guid.NewGuid())) |> runOnTestData
8484
printfn "%A" results
8585

8686
[<Test>]
@@ -116,3 +116,17 @@ let ``replay works`` () =
116116
()
117117
else failwith "not equal"
118118

119+
open Rezoom.SQL.Mapping
120+
open System.Data
121+
122+
type RawSQLQuery = SQL<"""
123+
select * from Users where unsafe_inject_raw(@whereClause)
124+
""">
125+
126+
[<Test>]
127+
let ``test raw sql parameter`` () =
128+
let results =
129+
RawSQLQuery.Command(whereClause = [| CommandText "1="; InlineParameter(DbType.Int32, 1) |]) |> runOnTestData
130+
for result in results do
131+
printfn "%A" result.Email
132+

0 commit comments

Comments
 (0)