@ -18,7 +18,9 @@ package org.apache.dolphinscheduler.server.worker.task.sql;
import com.fasterxml.jackson.databind.node.ArrayNode ;
import com.fasterxml.jackson.databind.node.ArrayNode ;
import com.fasterxml.jackson.databind.node.ObjectNode ;
import com.fasterxml.jackson.databind.node.ObjectNode ;
import org.apache.commons.lang.StringUtils ;
import org.apache.commons.lang.StringUtils ;
import org.apache.dolphinscheduler.alert.utils.MailUtils ;
import org.apache.dolphinscheduler.alert.utils.MailUtils ;
import org.apache.dolphinscheduler.common.Constants ;
import org.apache.dolphinscheduler.common.Constants ;
import org.apache.dolphinscheduler.common.enums.* ;
import org.apache.dolphinscheduler.common.enums.* ;
@ -41,6 +43,7 @@ import org.apache.dolphinscheduler.server.utils.ParamUtils;
import org.apache.dolphinscheduler.server.utils.UDFUtils ;
import org.apache.dolphinscheduler.server.utils.UDFUtils ;
import org.apache.dolphinscheduler.server.worker.task.AbstractTask ;
import org.apache.dolphinscheduler.server.worker.task.AbstractTask ;
import org.apache.dolphinscheduler.service.bean.SpringApplicationContext ;
import org.apache.dolphinscheduler.service.bean.SpringApplicationContext ;
import org.slf4j.Logger ;
import org.slf4j.Logger ;
import java.sql.* ;
import java.sql.* ;
@ -51,6 +54,7 @@ import java.util.stream.Collectors;
import static org.apache.dolphinscheduler.common.Constants.* ;
import static org.apache.dolphinscheduler.common.Constants.* ;
import static org.apache.dolphinscheduler.common.enums.DbType.HIVE ;
import static org.apache.dolphinscheduler.common.enums.DbType.HIVE ;
/ * *
/ * *
* sql task
* sql task
* /
* /
@ -148,6 +152,7 @@ public class SqlTask extends AbstractTask {
/ * *
/ * *
* ready to execute SQL and parameter entity Map
* ready to execute SQL and parameter entity Map
*
* @return SqlBinds
* @return SqlBinds
* /
* /
private SqlBinds getSqlAndSqlParamsMap ( String sql ) {
private SqlBinds getSqlAndSqlParamsMap ( String sql ) {
@ -182,7 +187,9 @@ public class SqlTask extends AbstractTask {
// special characters need to be escaped, ${} needs to be escaped
// special characters need to be escaped, ${} needs to be escaped
String rgex = "['\"]*\\$\\{(.*?)\\}['\"]*" ;
String rgex = "['\"]*\\$\\{(.*?)\\}['\"]*" ;
setSqlParamsMap ( sql , rgex , sqlParamsMap , paramsMap ) ;
setSqlParamsMap ( sql , rgex , sqlParamsMap , paramsMap ) ;
//Replace the original value in sql !{...} ,Does not participate in precompilation
String rgexo = "['\"]*\\!\\{(.*?)\\}['\"]*" ;
sql = replaceOriginalValue ( sql , rgexo , paramsMap ) ;
// replace the ${} of the SQL statement with the Placeholder
// replace the ${} of the SQL statement with the Placeholder
String formatSql = sql . replaceAll ( rgex , "?" ) ;
String formatSql = sql . replaceAll ( rgex , "?" ) ;
sqlBuilder . append ( formatSql ) ;
sqlBuilder . append ( formatSql ) ;
@ -192,6 +199,20 @@ public class SqlTask extends AbstractTask {
return new SqlBinds ( sqlBuilder . toString ( ) , sqlParamsMap ) ;
return new SqlBinds ( sqlBuilder . toString ( ) , sqlParamsMap ) ;
}
}
public String replaceOriginalValue ( String content , String rgex , Map < String , Property > sqlParamsMap ) {
Pattern pattern = Pattern . compile ( rgex ) ;
while ( true ) {
Matcher m = pattern . matcher ( content ) ;
if ( ! m . find ( ) ) {
break ;
}
String paramName = m . group ( 1 ) ;
String paramValue = sqlParamsMap . get ( paramName ) . getValue ( ) ;
content = m . replaceFirst ( paramValue ) ;
}
return content ;
}
@Override
@Override
public AbstractParameters getParameters ( ) {
public AbstractParameters getParameters ( ) {
return this . sqlParameters ;
return this . sqlParameters ;
@ -199,6 +220,7 @@ public class SqlTask extends AbstractTask {
/ * *
/ * *
* execute function and sql
* execute function and sql
*
* @param mainSqlBinds main sql binds
* @param mainSqlBinds main sql binds
* @param preStatementsBinds pre statements binds
* @param preStatementsBinds pre statements binds
* @param postStatementsBinds post statements binds
* @param postStatementsBinds post statements binds
@ -297,7 +319,6 @@ public class SqlTask extends AbstractTask {
*
*
* @param connection connection
* @param connection connection
* @param postStatementsBinds postStatementsBinds
* @param postStatementsBinds postStatementsBinds
* @throws Exception
* /
* /
private void postSql ( Connection connection ,
private void postSql ( Connection connection ,
List < SqlBinds > postStatementsBinds ) throws Exception {
List < SqlBinds > postStatementsBinds ) throws Exception {
@ -308,12 +329,12 @@ public class SqlTask extends AbstractTask {
}
}
}
}
}
}
/ * *
/ * *
* create temp function
* create temp function
*
*
* @param connection connection
* @param connection connection
* @param createFuncs createFuncs
* @param createFuncs createFuncs
* @throws Exception
* /
* /
private void createTempFunction ( Connection connection ,
private void createTempFunction ( Connection connection ,
List < String > createFuncs ) throws Exception {
List < String > createFuncs ) throws Exception {
@ -390,6 +411,7 @@ public class SqlTask extends AbstractTask {
/ * *
/ * *
* preparedStatement bind
* preparedStatement bind
*
* @param connection connection
* @param connection connection
* @param sqlBinds sqlBinds
* @param sqlBinds sqlBinds
* @return PreparedStatement
* @return PreparedStatement
@ -416,6 +438,7 @@ public class SqlTask extends AbstractTask {
/ * *
/ * *
* send mail as an attachment
* send mail as an attachment
*
* @param title title
* @param title title
* @param content content
* @param content content
* /
* /
@ -463,6 +486,7 @@ public class SqlTask extends AbstractTask {
/ * *
/ * *
* regular expressions match the contents between two specified strings
* regular expressions match the contents between two specified strings
*
* @param content content
* @param content content
* @param rgex rgex
* @param rgex rgex
* @param sqlParamsMap sql params map
* @param sqlParamsMap sql params map
@ -484,6 +508,7 @@ public class SqlTask extends AbstractTask {
/ * *
/ * *
* print replace sql
* print replace sql
*
* @param content content
* @param content content
* @param formatSql format sql
* @param formatSql format sql
* @param rgex rgex
* @param rgex rgex