Skip to content

A problem in executing SQL scripts #2309

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 2 commits into from
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 29 additions & 3 deletions src/main/java/org/apache/ibatis/jdbc/ScriptRunner.java
Original file line number Diff line number Diff line change
Expand Up @@ -51,11 +51,14 @@ public class ScriptRunner {
private boolean sendFullScript;
private boolean removeCRs;
private boolean escapeProcessing = true;
private boolean openDelimiter;

private PrintWriter logWriter = new PrintWriter(System.out);
private PrintWriter errorLogWriter = new PrintWriter(System.err);

private String delimiter = DEFAULT_DELIMITER;
private String extraFirstDelimiter;

private boolean fullLineDelimiter;

public ScriptRunner(Connection connection) {
Expand Down Expand Up @@ -85,8 +88,7 @@ public void setRemoveCRs(boolean removeCRs) {
/**
* Sets the escape processing.
*
* @param escapeProcessing
* the new escape processing
* @param escapeProcessing the new escape processing
* @since 3.1.1
*/
public void setEscapeProcessing(boolean escapeProcessing) {
Expand All @@ -109,6 +111,14 @@ public void setFullLineDelimiter(boolean fullLineDelimiter) {
this.fullLineDelimiter = fullLineDelimiter;
}

public String getExtraFirstDelimiter() {
return extraFirstDelimiter;
}

public void setExtraFirstDelimiter(String extraFirstDelimiter) {
this.extraFirstDelimiter = extraFirstDelimiter;
}

public void runScript(Reader reader) {
setAutoCommit();

Expand Down Expand Up @@ -223,20 +233,36 @@ private void handleLine(StringBuilder command, String line) throws SQLException
executeStatement(command.toString());
command.setLength(0);
} else if (trimmedLine.length() > 0) {
command.append(line);
command.append(endContains(line));
command.append(LINE_SEPARATOR);
}
}

private String endContains(String line) {
if (extraFirstDelimiter != null && extraFirstDelimiter.trim().length() > 0) {
return line.endsWith(extraFirstDelimiter) ? "" : line;
}
return line;
}

private boolean lineIsComment(String trimmedLine) {
return trimmedLine.startsWith("//") || trimmedLine.startsWith("--");
}

private boolean commandReadyToExecute(String trimmedLine) {
// issue #561 remove anything after the delimiter
if (extraFirstDelimiter != null && extraFirstDelimiter.trim().length() > 0) {
if (trimmedLine.endsWith(extraFirstDelimiter)) {
openDelimiter = !openDelimiter;
return !openDelimiter;
} else if (openDelimiter) {
return false;
}
}
return !fullLineDelimiter && trimmedLine.contains(delimiter) || fullLineDelimiter && trimmedLine.equals(delimiter);
}


private void executeStatement(String command) throws SQLException {
try (Statement statement = connection.createStatement()) {
statement.setEscapeProcessing(escapeProcessing);
Expand Down