BF [ 1824256 ] Convert sql casts
This commit is contained in:
parent
12a8377fdd
commit
085c094efe
|
@ -18,6 +18,7 @@ import java.util.ArrayList;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.TreeMap;
|
import java.util.TreeMap;
|
||||||
import java.util.Vector;
|
import java.util.Vector;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
import java.util.StringTokenizer;
|
import java.util.StringTokenizer;
|
||||||
import org.compiere.util.CLogger;
|
import org.compiere.util.CLogger;
|
||||||
|
@ -27,6 +28,8 @@ import org.compiere.util.Util;
|
||||||
* Convert Oracle SQL to PostgreSQL SQL
|
* Convert Oracle SQL to PostgreSQL SQL
|
||||||
*
|
*
|
||||||
* @author Victor Perez, Low Heng Sin, Carlos Ruiz
|
* @author Victor Perez, Low Heng Sin, Carlos Ruiz
|
||||||
|
* @author Teo Sarca, SC ARHIPAC SERVICE SRL
|
||||||
|
* <li>BF [ 1824256 ] Convert sql casts
|
||||||
*/
|
*/
|
||||||
public class Convert_PostgreSQL extends Convert_SQL92 {
|
public class Convert_PostgreSQL extends Convert_SQL92 {
|
||||||
/**
|
/**
|
||||||
|
@ -167,8 +170,48 @@ public class Convert_PostgreSQL extends Convert_SQL92 {
|
||||||
if (index != -1 && retValue.indexOf("(+)", index) != -1)
|
if (index != -1 && retValue.indexOf("(+)", index) != -1)
|
||||||
retValue = convertOuterJoin(retValue);
|
retValue = convertOuterJoin(retValue);
|
||||||
|
|
||||||
|
// Convert datatypes from CAST(.. as datatypes):
|
||||||
|
retValue = convertCast(retValue);
|
||||||
|
|
||||||
return retValue;
|
return retValue;
|
||||||
} // convertComplexStatement
|
} // convertComplexStatement
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert datatypes from CAST sentences
|
||||||
|
* <pre>
|
||||||
|
* cast(NULL as NVARCHAR2(255))
|
||||||
|
* =>cast(NULL as VARCHAR)
|
||||||
|
* </pre>
|
||||||
|
*/
|
||||||
|
private String convertCast(String sqlStatement) {
|
||||||
|
final String PATTERN_String = "\'([^']|(''))*\'";
|
||||||
|
final String PATTERN_DataType = "([\\w]+)(\\(\\d+\\))?";
|
||||||
|
final String pattern =
|
||||||
|
"CAST[\\s]*\\([\\s]*" // CAST<sp>(<sp>
|
||||||
|
+"(("+PATTERN_String+")|([^\\s]+))" // arg1 1(2,3)
|
||||||
|
+"[\\s]*AS[\\s]*" // <sp>AS<sp>
|
||||||
|
+"("+PATTERN_DataType+")" // arg2 (datatype) 4
|
||||||
|
+"\\s*\\)" // <sp>)
|
||||||
|
;
|
||||||
|
final int gidx_arg1 = 1;
|
||||||
|
final int gidx_arg2 = 7; // datatype w/o length
|
||||||
|
final Pattern p = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE);
|
||||||
|
Matcher m = p.matcher(sqlStatement);
|
||||||
|
|
||||||
|
TreeMap<String, String> convertMap = (TreeMap<String, String>)getConvertMap();
|
||||||
|
StringBuffer retValue = new StringBuffer(sqlStatement.length());
|
||||||
|
while (m.find()) {
|
||||||
|
String arg1 = m.group(gidx_arg1);
|
||||||
|
String arg2 = m.group(gidx_arg2);
|
||||||
|
//
|
||||||
|
String datatype = convertMap.get("\\b"+arg2.toUpperCase()+"\\b");
|
||||||
|
if (datatype == null)
|
||||||
|
datatype = arg2;
|
||||||
|
m.appendReplacement(retValue, "cast("+arg1+" as "+datatype+")");
|
||||||
|
}
|
||||||
|
m.appendTail(retValue);
|
||||||
|
return retValue.toString();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert RowNum.
|
* Convert RowNum.
|
||||||
|
|
|
@ -417,4 +417,37 @@ public final class Convert_PostgreSQLTest extends TestCase{
|
||||||
r = convert.convert(sql);
|
r = convert.convert(sql);
|
||||||
assertEquals(sqe, r[0]);
|
assertEquals(sqe, r[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test BF [ 1824256 ] Convert sql casts
|
||||||
|
*/
|
||||||
|
public void testCasts() {
|
||||||
|
String sql_begin = "SELECT ";
|
||||||
|
String[][] sql_tests = new String[][] {
|
||||||
|
// Oracle vs PostgreSQL
|
||||||
|
{"cast('N' as char)","cast('N' as char)"},
|
||||||
|
{"cast('this is a string' as nvarchar2(40))","cast('this is a string' as VARCHAR)"},
|
||||||
|
{"cast('this is a string as a ''string''' as nvarchar2(40))","cast('this is a string as a ''string''' as VARCHAR)"},
|
||||||
|
{"cast(tbl.IsView as char)","cast(tbl.IsView as char)"},
|
||||||
|
{"cast(trunc(tbl.Updated,'MONTH') as date)","cast(trunc(tbl.Updated,'MONTH') as TIMESTAMP)"},
|
||||||
|
{"cast(NULL as nvarchar2(255))","cast(NULL as VARCHAR)"},
|
||||||
|
{"cast(NULL as number(10))","cast(NULL as NUMERIC)"},
|
||||||
|
};
|
||||||
|
String sql_end = " FROM AD_Table tbl";
|
||||||
|
StringBuffer sql = new StringBuffer(sql_begin);
|
||||||
|
StringBuffer sqle = new StringBuffer(sql_begin);
|
||||||
|
for (int i = 0; i < sql_tests.length; i++) {
|
||||||
|
if (i > 0) {
|
||||||
|
sql.append(",");
|
||||||
|
sqle.append(",");
|
||||||
|
}
|
||||||
|
sql.append(sql_tests[i][0]);
|
||||||
|
sqle.append(sql_tests[i][1]);
|
||||||
|
}
|
||||||
|
sql.append(sql_end);
|
||||||
|
sqle.append(sql_end);
|
||||||
|
//
|
||||||
|
String[] r = convert.convert(sql.toString());
|
||||||
|
assertEquals(sqle.toString(), r[0]);
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue