提交 36d0af69 authored 作者: Owner's avatar Owner

Configurable column naming policy

上级 5ab7b5ae
......@@ -538,9 +538,6 @@ public class Set extends Prepared {
case SetTypes.COLUMN_NAME_RULES: {
session.getUser().checkAdmin();
System.out.println("1"+stringValue);
System.out.println("2"+expression.getColumnName());
System.out.println("3"+expression.getSQL());
ColumnNamer.configure(expression.getColumnName());
break;
}
......
......@@ -2,7 +2,6 @@ package org.h2.util;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
import org.h2.expression.Expression;
import org.h2.message.DbException;
......@@ -10,10 +9,11 @@ public class ColumnNamer {
private static final String DEFAULT_COLUMN_NAME = "DEFAULT";
private static final String DEFAULT_COMMAND = "DEFAULT";
private static final String REGULAR_EXPRESSION_MATCH_DISALLOWED = "REGULAREXPRESSIONMATCHDISALLOWED = ";
private static final String REGULAR_EXPRESSION_MATCH_ALLOWED = "REGULAREXPRESSIONMATCHALLOWED = ";
private static final String DEFAULT_COLUMN_NAME_PATTERN = "DEFAULTCOLUMNNAMEPATTERN = ";
private static final String MAX_IDENTIFIER_LENGTH = "MAXIDENTIFIERLENGTH = ";
private static final String REGULAR_EXPRESSION_MATCH_DISALLOWED = "REGULAR_EXPRESSION_MATCH_DISALLOWED = ";
private static final String REGULAR_EXPRESSION_MATCH_ALLOWED = "REGULAR_EXPRESSION_MATCH_ALLOWED = ";
private static final String DEFAULT_COLUMN_NAME_PATTERN = "DEFAULT_COLUMN_NAME_PATTERN = ";
private static final String MAX_IDENTIFIER_LENGTH = "MAX_IDENTIFIER_LENGTH = ";
private static final String EMULATE_COMMAND = "EMULATE = ";
/**
* Create a standardized column name that isn't null and doesn't have a CR/LF in it.
......@@ -57,7 +57,6 @@ public class ColumnNamer {
if(!isAllowableColumnName(columnName)){
columnName = null;
}
return columnName;
}
// try a name from the column alias
if (columnName==null && columnExp.getAlias()!=null && !DEFAULT_COLUMN_NAME.equals(columnExp.getAlias())){
......@@ -125,6 +124,14 @@ public class ColumnNamer {
return proposedName;
}
private static String unquoteString(String s){
if(s.startsWith("'") && s.endsWith("'")){
s = s.substring(1, s.length()-1);
return s;
}
return s;
}
static int maxIdentiferLength = Integer.MAX_VALUE;
static String regularExpressionMatchAllowed = "(?m)(?s).+";
......@@ -141,17 +148,17 @@ public class ColumnNamer {
regularExpressionMatchAllowed = "(?m)(?s).+";
regularExpressionMatchDisallowed = "(?m)(?s)[\\x00]";
defaultColumnNamePattern = "_UNNAMED_$$";
} else if(stringValue.equalsIgnoreCase("ORACLE128")){
} else if(stringValue.equalsIgnoreCase(EMULATE_COMMAND+"ORACLE128")){
maxIdentiferLength = 128;
regularExpressionMatchAllowed = "(?m)(?s)\"?[A-Za-z0-9_]+\"?";
regularExpressionMatchDisallowed = "(?m)(?s)[^A-Za-z0-9_\"]";
defaultColumnNamePattern = "_UNNAMED_$$";
} else if(stringValue.equalsIgnoreCase("ORACLE30")){
} else if(stringValue.equalsIgnoreCase(EMULATE_COMMAND+"ORACLE30")){
maxIdentiferLength = 30;
regularExpressionMatchAllowed = "(?m)(?s)\"?[A-Za-z0-9_]+\"?";
regularExpressionMatchDisallowed = "(?m)(?s)[^A-Za-z0-9_\"]";
defaultColumnNamePattern = "_UNNAMED_$$";
}else if(stringValue.equalsIgnoreCase("POSTGRES")){
}else if(stringValue.equalsIgnoreCase(EMULATE_COMMAND+"POSTGRES")){
maxIdentiferLength = 31;
regularExpressionMatchAllowed = "(?m)(?s)\"?[A-Za-z0-9_\"]+\"?";
regularExpressionMatchDisallowed = "(?m)(?s)[^A-Za-z0-9_\"]";
......@@ -159,11 +166,11 @@ public class ColumnNamer {
} else if(stringValue.startsWith(MAX_IDENTIFIER_LENGTH)){
maxIdentiferLength = Math.max(0,Integer.parseInt(stringValue.substring(MAX_IDENTIFIER_LENGTH.length())));
} else if(stringValue.startsWith(DEFAULT_COLUMN_NAME_PATTERN)){
defaultColumnNamePattern =stringValue.substring(DEFAULT_COLUMN_NAME_PATTERN.length());
defaultColumnNamePattern =unquoteString(stringValue.substring(DEFAULT_COLUMN_NAME_PATTERN.length()));
} else if(stringValue.startsWith(REGULAR_EXPRESSION_MATCH_ALLOWED)){
regularExpressionMatchAllowed=stringValue.substring(REGULAR_EXPRESSION_MATCH_ALLOWED.length());
regularExpressionMatchAllowed=unquoteString(stringValue.substring(REGULAR_EXPRESSION_MATCH_ALLOWED.length()));
} else if(stringValue.startsWith(REGULAR_EXPRESSION_MATCH_DISALLOWED)){
regularExpressionMatchDisallowed =stringValue.substring(REGULAR_EXPRESSION_MATCH_DISALLOWED.length());
regularExpressionMatchDisallowed =unquoteString(stringValue.substring(REGULAR_EXPRESSION_MATCH_DISALLOWED.length()));
}
else
{
......
......@@ -11,6 +11,8 @@ import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.io.PrintStream;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
......@@ -73,6 +75,10 @@ public class TestScript extends TestBase {
@Override
public void test() throws Exception {
Path currentRelativePath = Paths.get("");
String currentAbsolutePath = currentRelativePath.toAbsolutePath().toString();
System.out.println("Current absolute path is: " + currentAbsolutePath);
if (config.networked && config.big) {
return;
}
......
......@@ -2,3 +2,52 @@
-- and the EPL 1.0 (http://h2database.com/html/license.html).
-- Initial Developer: H2 Group
--
-- Try a custom column naming rules setup
SET COLUMN_NAME_RULES=MAX_IDENTIFIER_LENGTH = 10;
> ok
SET COLUMN_NAME_RULES=REGULAR_EXPRESSION_MATCH_ALLOWED = '[A-Za-z0-9_]+';
> ok
SET COLUMN_NAME_RULES=REGULAR_EXPRESSION_MATCH_DISALLOWED = '[^A-Za-z0-9_]+';
> ok
SET COLUMN_NAME_RULES=DEFAULT_COLUMN_NAME_PATTERN = 'noName$$';
> ok
SELECT 1 AS VERY_VERY_VERY_LONG_ID, SUM(X)+1 AS _123456789012345, SUM(X)+1 , SUM(X)+1
+47, 'x' , '!!!' , '!!!!' FROM SYSTEM_RANGE(1,2);
> VERY_VERY_ _123456789 SUMX1 SUMX147 x noName6 noName7
> ---------- ---------- ----- ------- - ------- -------
> 1 4 4 51 x !!! !!!!
SET COLUMN_NAME_RULES=EMULATE=ORACLE128;
> ok
SELECT 1 AS VERY_VERY_VERY_LONG_ID, SUM(X)+1 AS _123456789012345, SUM(X)+1 , SUM(X)+1
+47, 'x' , '!!!' , '!!!!' FROM SYSTEM_RANGE(1,2);
> VERY_VERY_VERY_LONG_ID _123456789012345 SUMX1 SUMX147 x _UNNAMED_6 _UNNAMED_7
> ---------------------- ---------------- ----- ------- - ---------- ----------
> 1 4 4 51 x !!! !!!!
SET COLUMN_NAME_RULES=EMULATE=ORACLE30;
> ok
SELECT 1 AS VERY_VERY_VERY_LONG_ID, SUM(X)+1 AS _123456789012345, SUM(X)+1 , SUM(X)+1
+47, 'x' , '!!!' , '!!!!', 'Very Long' AS _23456789012345678901234567890XXX FROM SYSTEM_RANGE(1,2);
> VERY_VERY_VERY_LONG_ID _123456789012345 SUMX1 SUMX147 x _UNNAMED_6 _UNNAMED_7 _23456789012345678901234567890
> ---------------------- ---------------- ----- ------- - ---------- ---------- ------------------------------
> 1 4 4 51 x !!! !!!! Very Long
SET COLUMN_NAME_RULES=EMULATE=POSTGRES;
> ok
SELECT 1 AS VERY_VERY_VERY_LONG_ID, SUM(X)+1 AS _123456789012345, SUM(X)+1 , SUM(X)+1
+47, 'x' , '!!!' , '!!!!', 999 AS "QuotedColumnId" FROM SYSTEM_RANGE(1,2);
> VERY_VERY_VERY_LONG_ID _123456789012345 SUMX1 SUMX147 x _UNNAMED_6 _UNNAMED_7 QuotedColumnId
> ---------------------- ---------------- ----- ------- - ---------- ---------- --------------
> 1 4 4 51 x !!! !!!! 999
SET COLUMN_NAME_RULES=DEFAULT;
> ok
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论