Skip to content

Commit 795e611

Browse files
feat: add the possibility to override data types in plugin options (#250)
* fix: rename agg query to cnt * feat: support data type override in plugin options * fix: update request files and fix Makefile flow * feat: generate missing tests * feat: add not null option in type override * fix: sqlc config files * fix: sqlc-fluff pre-commit * fix: sqlc-fluff pre-commit fix * fix: generated files * fix: README to include new option * fix: document override option
1 parent 75bf71b commit 795e611

72 files changed

Lines changed: 2989 additions & 884 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/build.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,4 +126,4 @@ jobs:
126126
- name: Verify pushed codegen requests are synced
127127
run: |
128128
dotnet publish LocalRunner -c release --output dist/
129-
sqlc -f sqlc.local.yaml diff
129+
sqlc -f sqlc.requests.yaml diff

.pre-commit-config.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
repos:
2+
- repo: https://github.com/sqlfluff/sqlfluff
3+
rev: 3.4.1
4+
hooks:
5+
- id: sqlfluff-fix
6+
args: [--FIX-EVEN-UNPARSABLE]

.sqlfluff

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
[sqlfluff]
2+
exclude_rules = AM04,AL03,RF02,RF04,AM05,AL01,ST06
3+
dialect = ansi
4+
5+
[sqlfluff:rules]
6+
7+
[sqlfluff:rules:LT02]
8+
capitalisation_policy = upper
9+
10+
[sqlfluff:paths:examples/config/postgresql/]
11+
dialect = postgres
12+
13+
[sqlfluff:paths:examples/config/mysql/]
14+
dialect = mysql
15+
16+
[sqlfluff:paths:examples/config/sqlite/]
17+
dialect = sqlite

CodeGenerator/Generators/DataClassesGen.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,24 +10,24 @@ namespace SqlcGenCsharp.Generators;
1010

1111
internal class DataClassesGen(DbDriver dbDriver)
1212
{
13-
public MemberDeclarationSyntax Generate(string name, ClassMember? classMember, IList<Column> columns, Options options)
13+
public MemberDeclarationSyntax Generate(string name, ClassMember? classMember, IList<Column> columns, Options options, Query? query)
1414
{
1515
var className = classMember is null ? name : classMember.Value.Name(name);
1616
if (options.DotnetFramework.IsDotnetCore() && !options.UseDapper)
17-
return GenerateAsRecord(className, columns);
18-
return GenerateAsCLass(className, columns);
17+
return GenerateAsRecord(className, columns, query);
18+
return GenerateAsCLass(className, columns, query);
1919
}
2020

21-
private MemberDeclarationSyntax GenerateAsRecord(string className, IList<Column> columns)
21+
private MemberDeclarationSyntax GenerateAsRecord(string className, IList<Column> columns, Query? query)
2222
{
2323
var seenEmbed = new Dictionary<string, int>();
2424
var recordParameters = columns
25-
.Select(column => $"{dbDriver.GetCsharpType(column)} {GetFieldName(column, seenEmbed)}")
25+
.Select(column => $"{dbDriver.GetCsharpType(column, query)} {GetFieldName(column, seenEmbed)}")
2626
.JoinByComma();
2727
return ParseMemberDeclaration($"public readonly record struct {className} ({recordParameters});")!;
2828
}
2929

30-
private ClassDeclarationSyntax GenerateAsCLass(string className, IList<Column> columns)
30+
private ClassDeclarationSyntax GenerateAsCLass(string className, IList<Column> columns, Query? query)
3131
{
3232
var modernDotnetSupported = dbDriver.Options.DotnetFramework.IsDotnetCore();
3333
return ClassDeclaration(className)
@@ -40,7 +40,7 @@ MemberDeclarationSyntax[] ColumnsToProperties()
4040
var seenEmbed = new Dictionary<string, int>();
4141
return columns.Select(column =>
4242
{
43-
var csharpType = dbDriver.GetCsharpType(column);
43+
var csharpType = dbDriver.GetCsharpType(column, query);
4444
var optionalRequiredModifier = RequiredModifierNeeded(column) ? "required" : string.Empty;
4545
var setterMethod = modernDotnetSupported ? "init" : "set";
4646
return ParseMemberDeclaration(
@@ -58,7 +58,7 @@ bool RequiredModifierNeeded(Column column)
5858
return false;
5959
if (column.EmbedTable != null)
6060
return true;
61-
return column.NotNull;
61+
return dbDriver.IsColumnNotNull(column, query);
6262
}
6363
}
6464

CodeGenerator/Generators/ModelsGen.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ private MemberDeclarationSyntax[] GenerateDataClasses(Dictionary<string, Diction
4646
from schemaTables in tables
4747
from table in schemaTables.Value
4848
let className = table.Value.Rel.Name.ToModelName(table.Value.Rel.Schema, dbDriver.DefaultSchema)
49-
select DataClassesGen.Generate(className, null, table.Value.Columns, dbDriver.Options)
49+
select DataClassesGen.Generate(className, null, table.Value.Columns, dbDriver.Options, null)
5050
).ToArray();
5151
}
5252

CodeGenerator/Generators/QueriesGen.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,14 +89,14 @@ private IEnumerable<MemberDeclarationSyntax> GetMembersForSingleQuery(Query quer
8989
private MemberDeclarationSyntax? GetQueryColumnsDataclass(Query query)
9090
{
9191
if (query.Columns.Count <= 0) return null;
92-
return DataClassesGen.Generate(query.Name, ClassMember.Row, query.Columns, dbDriver.Options);
92+
return DataClassesGen.Generate(query.Name, ClassMember.Row, query.Columns, dbDriver.Options, query);
9393
}
9494

9595
private MemberDeclarationSyntax? GetQueryParamsDataclass(Query query)
9696
{
9797
if (query.Params.Count <= 0) return null;
98-
var columns = query.Params.Select(dbDriver.GetColumnFromParam).ToList();
99-
return DataClassesGen.Generate(query.Name, ClassMember.Args, columns, dbDriver.Options);
98+
var columns = query.Params.Select(p => dbDriver.GetColumnFromParam(p, query)).ToList();
99+
return DataClassesGen.Generate(query.Name, ClassMember.Args, columns, dbDriver.Options, query);
100100
}
101101

102102
private MemberDeclarationSyntax? GetQueryTextConstant(Query query)
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
using Google.Protobuf;
2+
using Plugin;
3+
using SqlcGenCsharp;
4+
using System.Text;
5+
using System.Xml;
6+
7+
namespace CodegenTests;
8+
9+
public class CodegenTypeOverrideTests
10+
{
11+
private readonly Settings _postgresSettings = new()
12+
{
13+
Engine = "postgresql",
14+
Codegen = new Codegen { Out = "DummyProject" }
15+
};
16+
17+
private readonly Catalog _emptyCatalog = new()
18+
{
19+
Schemas =
20+
{
21+
new Schema
22+
{
23+
Name = string.Empty,
24+
Tables = { Capacity = 0 },
25+
Enums = { Capacity = 0 },
26+
}
27+
}
28+
};
29+
30+
private CodeGenerator CodeGenerator { get; } = new();
31+
32+
[Test]
33+
public void TestOverrideQueryColumnDataType()
34+
{
35+
var request = new GenerateRequest
36+
{
37+
Settings = _postgresSettings,
38+
Catalog = _emptyCatalog,
39+
PluginOptions = ByteString.CopyFrom("{\"overrides\":[{\"column\":\"GetPostgresFunctions:max_integer\",\"csharp_type\":{\"type\":\"int\"}},{\"column\":\"GetPostgresFunctions:max_varchar\",\"csharp_type\":{\"type\":\"string\"}},{\"column\":\"GetPostgresFunctions:max_timestamp\",\"csharp_type\":{\"type\":\"DateTime\"}}]}", Encoding.UTF8)
40+
};
41+
42+
var response = CodeGenerator.Generate(request);
43+
}
44+
}

CodegenTests/test-requests/DefaultSchemaEnum/query.sql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22
SELECT * FROM dummy_table LIMIT 1;
33

44
-- name: TestInsert :exec
5-
INSERT INTO dummy_table (dummy_column) VALUES (?);
5+
INSERT INTO dummy_table (dummy_column) VALUES (?);
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
CREATE TABLE dummy_table
22
(
3-
dummy_column ENUM ('x', 'y')
4-
);
3+
dummy_column ENUM('x', 'y')
4+
);

CodegenTests/test-requests/SchemaScopedEnum/schema.sql

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@ CREATE SCHEMA dummy_schema;
22

33
CREATE TABLE dummy_schema.dummy_table
44
(
5-
dummy_column ENUM ('x', 'y')
6-
);
5+
dummy_column ENUM('x', 'y')
6+
);

0 commit comments

Comments
 (0)