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

Configurable column naming policy

上级 5ab7b5ae
...@@ -538,9 +538,6 @@ public class Set extends Prepared { ...@@ -538,9 +538,6 @@ public class Set extends Prepared {
case SetTypes.COLUMN_NAME_RULES: { case SetTypes.COLUMN_NAME_RULES: {
session.getUser().checkAdmin(); session.getUser().checkAdmin();
System.out.println("1"+stringValue);
System.out.println("2"+expression.getColumnName());
System.out.println("3"+expression.getSQL());
ColumnNamer.configure(expression.getColumnName()); ColumnNamer.configure(expression.getColumnName());
break; break;
} }
......
...@@ -2,7 +2,6 @@ package org.h2.util; ...@@ -2,7 +2,6 @@ package org.h2.util;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
import org.h2.expression.Expression; import org.h2.expression.Expression;
import org.h2.message.DbException; import org.h2.message.DbException;
...@@ -10,10 +9,11 @@ public class ColumnNamer { ...@@ -10,10 +9,11 @@ public class ColumnNamer {
private static final String DEFAULT_COLUMN_NAME = "DEFAULT"; private static final String DEFAULT_COLUMN_NAME = "DEFAULT";
private static final String DEFAULT_COMMAND = "DEFAULT"; private static final String DEFAULT_COMMAND = "DEFAULT";
private static final String REGULAR_EXPRESSION_MATCH_DISALLOWED = "REGULAREXPRESSIONMATCHDISALLOWED = "; private static final String REGULAR_EXPRESSION_MATCH_DISALLOWED = "REGULAR_EXPRESSION_MATCH_DISALLOWED = ";
private static final String REGULAR_EXPRESSION_MATCH_ALLOWED = "REGULAREXPRESSIONMATCHALLOWED = "; private static final String REGULAR_EXPRESSION_MATCH_ALLOWED = "REGULAR_EXPRESSION_MATCH_ALLOWED = ";
private static final String DEFAULT_COLUMN_NAME_PATTERN = "DEFAULTCOLUMNNAMEPATTERN = "; private static final String DEFAULT_COLUMN_NAME_PATTERN = "DEFAULT_COLUMN_NAME_PATTERN = ";
private static final String MAX_IDENTIFIER_LENGTH = "MAXIDENTIFIERLENGTH = "; 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. * 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 { ...@@ -57,7 +57,6 @@ public class ColumnNamer {
if(!isAllowableColumnName(columnName)){ if(!isAllowableColumnName(columnName)){
columnName = null; columnName = null;
} }
return columnName;
} }
// try a name from the column alias // try a name from the column alias
if (columnName==null && columnExp.getAlias()!=null && !DEFAULT_COLUMN_NAME.equals(columnExp.getAlias())){ if (columnName==null && columnExp.getAlias()!=null && !DEFAULT_COLUMN_NAME.equals(columnExp.getAlias())){
...@@ -125,6 +124,14 @@ public class ColumnNamer { ...@@ -125,6 +124,14 @@ public class ColumnNamer {
return proposedName; 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 int maxIdentiferLength = Integer.MAX_VALUE;
static String regularExpressionMatchAllowed = "(?m)(?s).+"; static String regularExpressionMatchAllowed = "(?m)(?s).+";
...@@ -141,17 +148,17 @@ public class ColumnNamer { ...@@ -141,17 +148,17 @@ public class ColumnNamer {
regularExpressionMatchAllowed = "(?m)(?s).+"; regularExpressionMatchAllowed = "(?m)(?s).+";
regularExpressionMatchDisallowed = "(?m)(?s)[\\x00]"; regularExpressionMatchDisallowed = "(?m)(?s)[\\x00]";
defaultColumnNamePattern = "_UNNAMED_$$"; defaultColumnNamePattern = "_UNNAMED_$$";
} else if(stringValue.equalsIgnoreCase("ORACLE128")){ } else if(stringValue.equalsIgnoreCase(EMULATE_COMMAND+"ORACLE128")){
maxIdentiferLength = 128; maxIdentiferLength = 128;
regularExpressionMatchAllowed = "(?m)(?s)\"?[A-Za-z0-9_]+\"?"; regularExpressionMatchAllowed = "(?m)(?s)\"?[A-Za-z0-9_]+\"?";
regularExpressionMatchDisallowed = "(?m)(?s)[^A-Za-z0-9_\"]"; regularExpressionMatchDisallowed = "(?m)(?s)[^A-Za-z0-9_\"]";
defaultColumnNamePattern = "_UNNAMED_$$"; defaultColumnNamePattern = "_UNNAMED_$$";
} else if(stringValue.equalsIgnoreCase("ORACLE30")){ } else if(stringValue.equalsIgnoreCase(EMULATE_COMMAND+"ORACLE30")){
maxIdentiferLength = 30; maxIdentiferLength = 30;
regularExpressionMatchAllowed = "(?m)(?s)\"?[A-Za-z0-9_]+\"?"; regularExpressionMatchAllowed = "(?m)(?s)\"?[A-Za-z0-9_]+\"?";
regularExpressionMatchDisallowed = "(?m)(?s)[^A-Za-z0-9_\"]"; regularExpressionMatchDisallowed = "(?m)(?s)[^A-Za-z0-9_\"]";
defaultColumnNamePattern = "_UNNAMED_$$"; defaultColumnNamePattern = "_UNNAMED_$$";
}else if(stringValue.equalsIgnoreCase("POSTGRES")){ }else if(stringValue.equalsIgnoreCase(EMULATE_COMMAND+"POSTGRES")){
maxIdentiferLength = 31; maxIdentiferLength = 31;
regularExpressionMatchAllowed = "(?m)(?s)\"?[A-Za-z0-9_\"]+\"?"; regularExpressionMatchAllowed = "(?m)(?s)\"?[A-Za-z0-9_\"]+\"?";
regularExpressionMatchDisallowed = "(?m)(?s)[^A-Za-z0-9_\"]"; regularExpressionMatchDisallowed = "(?m)(?s)[^A-Za-z0-9_\"]";
...@@ -159,11 +166,11 @@ public class ColumnNamer { ...@@ -159,11 +166,11 @@ public class ColumnNamer {
} else if(stringValue.startsWith(MAX_IDENTIFIER_LENGTH)){ } else if(stringValue.startsWith(MAX_IDENTIFIER_LENGTH)){
maxIdentiferLength = Math.max(0,Integer.parseInt(stringValue.substring(MAX_IDENTIFIER_LENGTH.length()))); maxIdentiferLength = Math.max(0,Integer.parseInt(stringValue.substring(MAX_IDENTIFIER_LENGTH.length())));
} else if(stringValue.startsWith(DEFAULT_COLUMN_NAME_PATTERN)){ } 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)){ } 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)){ } 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 else
{ {
......
...@@ -11,6 +11,8 @@ import java.io.InputStream; ...@@ -11,6 +11,8 @@ import java.io.InputStream;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.io.LineNumberReader; import java.io.LineNumberReader;
import java.io.PrintStream; import java.io.PrintStream;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.sql.Connection; import java.sql.Connection;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
...@@ -73,6 +75,10 @@ public class TestScript extends TestBase { ...@@ -73,6 +75,10 @@ public class TestScript extends TestBase {
@Override @Override
public void test() throws Exception { 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) { if (config.networked && config.big) {
return; return;
} }
......
...@@ -2,3 +2,52 @@ ...@@ -2,3 +2,52 @@
-- and the EPL 1.0 (http://h2database.com/html/license.html). -- and the EPL 1.0 (http://h2database.com/html/license.html).
-- Initial Developer: H2 Group -- 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 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论