Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions src/main/java/dev/sqlcj/analysis/QueryAnalyzer.java
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ private QueryModel analyzeSelect(Query query, Select select, Schema schema) {
return new QueryModel(
query.name(),
query.type(),
table.getName(),
table.getUnquotedName(),
toExecutableSql(query.sql()),
bindingParameterIndexes,
columns,
Expand Down Expand Up @@ -104,7 +104,7 @@ private List<QueryParameter> resolveBindingParameters(PlainSelect plainSelect, S
return List.of();
}

dev.sqlcj.schema.Table schemaTable = findTable(schema, table.getName());
dev.sqlcj.schema.Table schemaTable = findTable(schema, table.getUnquotedName());

List<QueryParameter> parameters = new ArrayList<>();

Expand Down Expand Up @@ -165,7 +165,7 @@ private void resolveInExpression(InExpression in, dev.sqlcj.schema.Table table,
return;
}

dev.sqlcj.schema.Column schemaColumn = findColumn(table, column.getColumnName());
dev.sqlcj.schema.Column schemaColumn = findColumn(table, column.getUnquotedColumnName());

Expression rightExpression = in.getRightExpression();

Expand Down Expand Up @@ -261,7 +261,7 @@ private void resolveParameterComparison(
) {
addParameter(
parameter,
column.getColumnName(),
column.getUnquotedColumnName(),
table,
parameters
);
Expand All @@ -274,7 +274,7 @@ private void resolveParameterComparison(
) {
addParameter(
parameter,
column.getColumnName(),
column.getUnquotedColumnName(),
table,
parameters
);
Expand Down Expand Up @@ -313,7 +313,7 @@ private void addParameter(
}

private List<QueryColumn> resolveColumns(PlainSelect plainSelect, Schema schema, Table table) {
dev.sqlcj.schema.Table schemaTable = findTable(schema, table.getName());
dev.sqlcj.schema.Table schemaTable = findTable(schema, table.getUnquotedName());

List<QueryColumn> columns = new ArrayList<>();

Expand All @@ -324,7 +324,7 @@ private List<QueryColumn> resolveColumns(PlainSelect plainSelect, Schema schema,
}

if (selectItem.getExpression() instanceof net.sf.jsqlparser.schema.Column column) {
dev.sqlcj.schema.Column schemaColumn = findColumn(schemaTable, column.getColumnName());
dev.sqlcj.schema.Column schemaColumn = findColumn(schemaTable, column.getUnquotedColumnName());

columns.add(
new QueryColumn(
Expand Down
58 changes: 50 additions & 8 deletions src/main/java/dev/sqlcj/compiler/SqlcjCompiler.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,10 @@
import java.io.IOException;
import java.io.UncheckedIOException;
import java.nio.file.Path;
import java.util.HashSet;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
import java.util.Locale;
import java.util.Map;

public final class SqlcjCompiler {

Expand All @@ -36,7 +37,7 @@ public void compile(Config config) {

Path outputDirectory = Path.of(config.java().out());

Set<Path> generatedPaths = new HashSet<>();
Map<String, GeneratedQuery> generatedQueries = new HashMap<>();

for (Source source : sources) {
Schema schema = schemaParser.parse(source.schema());
Expand All @@ -47,7 +48,7 @@ public void compile(Config config) {
schema,
codeGenerator,
outputDirectory,
generatedPaths
generatedQueries
);
}
}
Expand All @@ -58,19 +59,57 @@ private void compileQuery(
Schema schema,
CodeGenerator codeGenerator,
Path outputDirectory,
Set<Path> generatedPaths
Map<String, GeneratedQuery> generatedQueries
) {
Statement statement = sqlParser.parse(query.sql());
QueryModel model = queryAnalyzer.analyze(query, statement, schema);
GeneratedFile file = codeGenerator.generate(model);

if (!generatedPaths.add(file.path())) {
checkGeneratedPath(query, file, generatedQueries);

write(file, outputDirectory);
}

/**
* Rejects a generated path that repeats, or differs only by case from, an
* already generated path before the earlier file can be overwritten.
*/
private void checkGeneratedPath(
Query query,
GeneratedFile file,
Map<String, GeneratedQuery> generatedQueries
) {
String portabilityKey = file.path()
.toString()
.toLowerCase(Locale.ROOT);

GeneratedQuery generated = generatedQueries.get(portabilityKey);

if (generated == null) {
generatedQueries.put(
portabilityKey,
new GeneratedQuery(query.name(), file.path())
);

return;
}

if (generated.path().equals(file.path())) {
throw new CompilationException(
"Duplicate generated file: " + file.path()
"Duplicate generated file for queries '%s' and '%s': %s"
.formatted(generated.queryName(), query.name(), file.path())
);
}

write(file, outputDirectory);
throw new CompilationException(
"Generated file paths for queries '%s' and '%s' differ only by case: %s and %s"
.formatted(
generated.queryName(),
query.name(),
generated.path(),
file.path()
)
);
}

private void write(GeneratedFile file, Path outputDirectory) {
Expand All @@ -80,4 +119,7 @@ private void write(GeneratedFile file, Path outputDirectory) {
throw new UncheckedIOException(e);
}
}

private record GeneratedQuery(String queryName, Path path) {
}
}
Loading