From cde69daad1601091f18078ca07b37b723d8a77e5 Mon Sep 17 00:00:00 2001 From: gengjun Date: Tue, 25 Aug 2020 19:57:26 +0800 Subject: [PATCH 1/3] fix mysql return bug --- .../main/java/org/apache/doris/qe/StmtExecutor.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java b/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java index 14a811a3417ed0..b68e84bf07a32f 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java @@ -622,13 +622,15 @@ private void handleQueryStmt() throws Exception { RowBatch batch; MysqlChannel channel = context.getMysqlChannel(); boolean isOutfileQuery = queryStmt.hasOutFileClause(); - if (!isOutfileQuery) { - sendFields(queryStmt.getColLabels(), queryStmt.getResultExprs()); - } + boolean isSendFields = false; while (true) { batch = coord.getNext(); // for outfile query, there will be only one empty batch send back with eos flag if (batch.getBatch() != null && !isOutfileQuery) { + if (!isSendFields) { + sendFields(queryStmt.getColLabels(), queryStmt.getResultExprs()); + isSendFields = true; + } for (ByteBuffer row : batch.getBatch().getRows()) { channel.sendOnePacket(row); } @@ -638,6 +640,9 @@ private void handleQueryStmt() throws Exception { break; } } + if (!isSendFields) { + sendFields(queryStmt.getColLabels(), queryStmt.getResultExprs()); + } statisticsForAuditLog = batch.getQueryStatistics(); if (!isOutfileQuery) { From e1a7d9652940776a8020e39025a0c44d36f521ee Mon Sep 17 00:00:00 2001 From: gengjun Date: Tue, 25 Aug 2020 20:36:27 +0800 Subject: [PATCH 2/3] fix bug --- fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java b/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java index b68e84bf07a32f..cbd8c15b6b393e 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java @@ -640,7 +640,7 @@ private void handleQueryStmt() throws Exception { break; } } - if (!isSendFields) { + if (!isSendFields && !isOutfileQuery) { sendFields(queryStmt.getColLabels(), queryStmt.getResultExprs()); } From 9c326d5aefd849632bb12da8ade1ed28367d78ba Mon Sep 17 00:00:00 2001 From: gengjun Date: Wed, 26 Aug 2020 10:24:39 +0800 Subject: [PATCH 3/3] add comment --- .../src/main/java/org/apache/doris/qe/StmtExecutor.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java b/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java index cbd8c15b6b393e..be7405c2d5dad2 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java @@ -608,9 +608,6 @@ private void handleQueryStmt() throws Exception { coord.exec(); - // if python's MysqlDb get error after sendfields, it can't catch the exception - // so We need to send fields after first batch arrived - // send result // 1. If this is a query with OUTFILE clause, eg: select * from tbl1 into outfile xxx, // We will not send real query result to client. Instead, we only send OK to client with @@ -627,6 +624,8 @@ private void handleQueryStmt() throws Exception { batch = coord.getNext(); // for outfile query, there will be only one empty batch send back with eos flag if (batch.getBatch() != null && !isOutfileQuery) { + // For some language driver, getting error packet after fields packet will be recognized as a success result + // so We need to send fields after first batch arrived if (!isSendFields) { sendFields(queryStmt.getColLabels(), queryStmt.getResultExprs()); isSendFields = true;