From 29b7c8745c1153806f3038ac57266a814cb4d8e7 Mon Sep 17 00:00:00 2001 From: Philip Z Date: Mon, 20 Jul 2026 18:23:22 +0800 Subject: [PATCH] feat: introduce dialect mapColumnType for DDL type mapping Signed-off-by: Philip Z --- .../teaql/core/postgres/PostgresDataServiceExecutor.java | 3 --- .../main/java/io/teaql/core/sql/dialect/MySqlDialect.java | 8 ++++++++ .../java/io/teaql/core/sql/dialect/OracleDialect.java | 8 ++++++++ .../java/io/teaql/core/sql/dialect/PostgreSqlDialect.java | 8 ++++++++ .../main/java/io/teaql/core/sql/dialect/SqlDialect.java | 7 +++++++ .../io/teaql/core/sql/portable/PortableSQLRepository.java | 4 ++-- 6 files changed, 33 insertions(+), 5 deletions(-) diff --git a/teaql-postgres/src/main/java/io/teaql/core/postgres/PostgresDataServiceExecutor.java b/teaql-postgres/src/main/java/io/teaql/core/postgres/PostgresDataServiceExecutor.java index 9d21c7dc..17684c03 100644 --- a/teaql-postgres/src/main/java/io/teaql/core/postgres/PostgresDataServiceExecutor.java +++ b/teaql-postgres/src/main/java/io/teaql/core/postgres/PostgresDataServiceExecutor.java @@ -39,9 +39,6 @@ public int[] batchUpdate(String sql, List batchArgs) { @Override public void execute(String sql) { - if (sql != null) { - sql = sql.replace("", "255"); - } getExecutionAdapter().execute(sql); } diff --git a/teaql-sql-portable/src/main/java/io/teaql/core/sql/dialect/MySqlDialect.java b/teaql-sql-portable/src/main/java/io/teaql/core/sql/dialect/MySqlDialect.java index 30029cdc..f1b66615 100644 --- a/teaql-sql-portable/src/main/java/io/teaql/core/sql/dialect/MySqlDialect.java +++ b/teaql-sql-portable/src/main/java/io/teaql/core/sql/dialect/MySqlDialect.java @@ -39,4 +39,12 @@ public String buildSubsidiaryInsertSql(String tableName, List tableColum escapeIdentifier(tableName), tableColumns.stream().map(c -> escapeIdentifier(c) + " = ?").collect(Collectors.joining(" , "))); } + + @Override + public String mapColumnType(String type) { + if (type != null && type.contains("")) { + return type.replace("VARCHAR()", "LONGTEXT").replace("", "65535"); + } + return type; + } } diff --git a/teaql-sql-portable/src/main/java/io/teaql/core/sql/dialect/OracleDialect.java b/teaql-sql-portable/src/main/java/io/teaql/core/sql/dialect/OracleDialect.java index 019ec237..c8232705 100644 --- a/teaql-sql-portable/src/main/java/io/teaql/core/sql/dialect/OracleDialect.java +++ b/teaql-sql-portable/src/main/java/io/teaql/core/sql/dialect/OracleDialect.java @@ -29,4 +29,12 @@ public String getPartitionSQL() { public String buildSubsidiaryInsertSql(String tableName, java.util.List tableColumns) { throw new UnsupportedOperationException("Subsidiary insert not implemented for Oracle yet"); } + + @Override + public String mapColumnType(String type) { + if (type != null && type.contains("")) { + return type.replace("VARCHAR()", "CLOB").replace("", "4000"); + } + return type; + } } diff --git a/teaql-sql-portable/src/main/java/io/teaql/core/sql/dialect/PostgreSqlDialect.java b/teaql-sql-portable/src/main/java/io/teaql/core/sql/dialect/PostgreSqlDialect.java index d2f43dff..21553502 100644 --- a/teaql-sql-portable/src/main/java/io/teaql/core/sql/dialect/PostgreSqlDialect.java +++ b/teaql-sql-portable/src/main/java/io/teaql/core/sql/dialect/PostgreSqlDialect.java @@ -50,4 +50,12 @@ public String buildSubsidiaryInsertSql(String tableName, List tableColum return StrUtil.format("INSERT INTO {} ({}) VALUES ({}) ON CONFLICT ({}) DO UPDATE SET {}", escapeIdentifier(tableName), columnsStr, valuesStr, escapeIdentifier("id"), updateSetStr); } + + @Override + public String mapColumnType(String type) { + if (type != null && type.contains("")) { + return type.replace("VARCHAR()", "TEXT").replace("", "255"); + } + return type; + } } diff --git a/teaql-sql-portable/src/main/java/io/teaql/core/sql/dialect/SqlDialect.java b/teaql-sql-portable/src/main/java/io/teaql/core/sql/dialect/SqlDialect.java index c68e510e..9ee6ed27 100644 --- a/teaql-sql-portable/src/main/java/io/teaql/core/sql/dialect/SqlDialect.java +++ b/teaql-sql-portable/src/main/java/io/teaql/core/sql/dialect/SqlDialect.java @@ -26,4 +26,11 @@ public interface SqlDialect { * For Postgres this could be INSERT ... ON CONFLICT DO UPDATE. */ String buildSubsidiaryInsertSql(String tableName, List columns); + + /** + * Map a generic column type (like VARCHAR()) to a dialect-specific type (like TEXT or VARCHAR(MAX)). + */ + default String mapColumnType(String type) { + return type; + } } diff --git a/teaql-sql-portable/src/main/java/io/teaql/core/sql/portable/PortableSQLRepository.java b/teaql-sql-portable/src/main/java/io/teaql/core/sql/portable/PortableSQLRepository.java index 9b89587e..6da484d2 100644 --- a/teaql-sql-portable/src/main/java/io/teaql/core/sql/portable/PortableSQLRepository.java +++ b/teaql-sql-portable/src/main/java/io/teaql/core/sql/portable/PortableSQLRepository.java @@ -641,7 +641,7 @@ protected void createTable(UserContext ctx, String table, List column sb.append("CREATE TABLE ").append(table).append(" (\n"); sb.append(columns.stream() .map(column -> { - String dbColumn = column.getColumnName() + " " + column.getType(); + String dbColumn = dialect.escapeIdentifier(column.getColumnName()) + " " + dialect.mapColumnType(column.getType()); if (column.isIdColumn()) dbColumn += " PRIMARY KEY"; return dbColumn; }) @@ -655,7 +655,7 @@ protected void createTable(UserContext ctx, String table, List column protected void addColumn(UserContext ctx, SQLColumn column) { String sql = StrUtil.format("ALTER TABLE {} ADD COLUMN {} {}", - column.getTableName(), column.getColumnName(), column.getType()); + dialect.escapeIdentifier(column.getTableName()), dialect.escapeIdentifier(column.getColumnName()), dialect.mapColumnType(column.getType())); logInfo(sql + ";"); if (ensureTableEnabled(ctx)) { try { database.execute(ctx, sql); } catch (Exception e) { logInfo("Ignored: " + e.getMessage()); }