Merge remote-tracking branch 'origin/master' into feature/d1
This commit is contained in:
commit
be358f8fbf
|
@ -191,6 +191,7 @@ void tscFieldInfoClear(SFieldInfo* pFieldInfo);
|
||||||
void tscFieldInfoCopy(SFieldInfo* pFieldInfo, const SFieldInfo* pSrc, const SArray* pExprList);
|
void tscFieldInfoCopy(SFieldInfo* pFieldInfo, const SFieldInfo* pSrc, const SArray* pExprList);
|
||||||
|
|
||||||
static FORCE_INLINE int32_t tscNumOfFields(SQueryInfo* pQueryInfo) { return pQueryInfo->fieldsInfo.numOfOutput; }
|
static FORCE_INLINE int32_t tscNumOfFields(SQueryInfo* pQueryInfo) { return pQueryInfo->fieldsInfo.numOfOutput; }
|
||||||
|
int32_t tscGetFirstInvisibleFieldPos(SQueryInfo* pQueryInfo);
|
||||||
|
|
||||||
int32_t tscFieldInfoCompare(const SFieldInfo* pFieldInfo1, const SFieldInfo* pFieldInfo2, int32_t *diffSize);
|
int32_t tscFieldInfoCompare(const SFieldInfo* pFieldInfo1, const SFieldInfo* pFieldInfo2, int32_t *diffSize);
|
||||||
void tscInsertPrimaryTsSourceColumn(SQueryInfo* pQueryInfo, uint64_t uid);
|
void tscInsertPrimaryTsSourceColumn(SQueryInfo* pQueryInfo, uint64_t uid);
|
||||||
|
|
|
@ -7231,9 +7231,7 @@ static int32_t doAddGroupbyColumnsOnDemand(SSqlCmd* pCmd, SQueryInfo* pQueryInfo
|
||||||
s = &pSchema[colIndex];
|
s = &pSchema[colIndex];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t size = tscNumOfExprs(pQueryInfo);
|
|
||||||
|
|
||||||
if (TSDB_COL_IS_TAG(pColIndex->flag)) {
|
if (TSDB_COL_IS_TAG(pColIndex->flag)) {
|
||||||
|
|
||||||
int32_t f = TSDB_FUNC_TAG;
|
int32_t f = TSDB_FUNC_TAG;
|
||||||
|
@ -7241,8 +7239,10 @@ static int32_t doAddGroupbyColumnsOnDemand(SSqlCmd* pCmd, SQueryInfo* pQueryInfo
|
||||||
f = TSDB_FUNC_TAGPRJ;
|
f = TSDB_FUNC_TAGPRJ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t pos = tscGetFirstInvisibleFieldPos(pQueryInfo);
|
||||||
|
|
||||||
SColumnIndex index = {.tableIndex = pQueryInfo->groupbyExpr.tableIndex, .columnIndex = colIndex};
|
SColumnIndex index = {.tableIndex = pQueryInfo->groupbyExpr.tableIndex, .columnIndex = colIndex};
|
||||||
SExprInfo* pExpr = tscExprAppend(pQueryInfo, f, &index, s->type, s->bytes, getNewResColId(pCmd), s->bytes, true);
|
SExprInfo* pExpr = tscExprInsert(pQueryInfo, pos, f, &index, s->type, s->bytes, getNewResColId(pCmd), s->bytes, true);
|
||||||
|
|
||||||
memset(pExpr->base.aliasName, 0, sizeof(pExpr->base.aliasName));
|
memset(pExpr->base.aliasName, 0, sizeof(pExpr->base.aliasName));
|
||||||
tstrncpy(pExpr->base.aliasName, s->name, sizeof(pExpr->base.aliasName));
|
tstrncpy(pExpr->base.aliasName, s->name, sizeof(pExpr->base.aliasName));
|
||||||
|
@ -7252,13 +7252,15 @@ static int32_t doAddGroupbyColumnsOnDemand(SSqlCmd* pCmd, SQueryInfo* pQueryInfo
|
||||||
|
|
||||||
// NOTE: tag column does not add to source column list
|
// NOTE: tag column does not add to source column list
|
||||||
SColumnList ids = createColumnList(1, 0, pColIndex->colIndex);
|
SColumnList ids = createColumnList(1, 0, pColIndex->colIndex);
|
||||||
insertResultField(pQueryInfo, (int32_t)size, &ids, s->bytes, (int8_t)s->type, s->name, pExpr);
|
insertResultField(pQueryInfo, pos, &ids, s->bytes, (int8_t)s->type, s->name, pExpr);
|
||||||
} else {
|
} else {
|
||||||
// if this query is "group by" normal column, time window query is not allowed
|
// if this query is "group by" normal column, time window query is not allowed
|
||||||
if (isTimeWindowQuery(pQueryInfo)) {
|
if (isTimeWindowQuery(pQueryInfo)) {
|
||||||
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg1);
|
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t size = tscNumOfExprs(pQueryInfo);
|
||||||
|
|
||||||
bool hasGroupColumn = false;
|
bool hasGroupColumn = false;
|
||||||
for (int32_t j = 0; j < size; ++j) {
|
for (int32_t j = 0; j < size; ++j) {
|
||||||
SExprInfo* pExpr = tscExprGet(pQueryInfo, j);
|
SExprInfo* pExpr = tscExprGet(pQueryInfo, j);
|
||||||
|
|
|
@ -2120,6 +2120,22 @@ TAOS_FIELD tscCreateField(int8_t type, const char* name, int16_t bytes) {
|
||||||
return f;
|
return f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t tscGetFirstInvisibleFieldPos(SQueryInfo* pQueryInfo) {
|
||||||
|
if (pQueryInfo->fieldsInfo.numOfOutput <= 0 || pQueryInfo->fieldsInfo.internalField == NULL) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < pQueryInfo->fieldsInfo.numOfOutput; ++i) {
|
||||||
|
SInternalField* pField = taosArrayGet(pQueryInfo->fieldsInfo.internalField, i);
|
||||||
|
if (!pField->visible) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return pQueryInfo->fieldsInfo.numOfOutput;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
SInternalField* tscFieldInfoAppend(SFieldInfo* pFieldInfo, TAOS_FIELD* pField) {
|
SInternalField* tscFieldInfoAppend(SFieldInfo* pFieldInfo, TAOS_FIELD* pField) {
|
||||||
assert(pFieldInfo != NULL);
|
assert(pFieldInfo != NULL);
|
||||||
pFieldInfo->numOfOutput++;
|
pFieldInfo->numOfOutput++;
|
||||||
|
|
|
@ -18,7 +18,7 @@ public class RestfulConnection extends AbstractConnection {
|
||||||
private final String url;
|
private final String url;
|
||||||
private final String database;
|
private final String database;
|
||||||
private final String token;
|
private final String token;
|
||||||
/******************************************************/
|
|
||||||
private boolean isClosed;
|
private boolean isClosed;
|
||||||
private final DatabaseMetaData metadata;
|
private final DatabaseMetaData metadata;
|
||||||
|
|
||||||
|
|
|
@ -88,17 +88,24 @@ public class RestfulStatement extends AbstractStatement {
|
||||||
}
|
}
|
||||||
|
|
||||||
private String getUrl() throws SQLException {
|
private String getUrl() throws SQLException {
|
||||||
|
String dbname = conn.getClientInfo(TSDBDriver.PROPERTY_KEY_DBNAME);
|
||||||
|
if (dbname == null || dbname.trim().isEmpty()) {
|
||||||
|
dbname = "";
|
||||||
|
} else {
|
||||||
|
dbname = "/" + dbname.toLowerCase();
|
||||||
|
}
|
||||||
TimestampFormat timestampFormat = TimestampFormat.valueOf(conn.getClientInfo(TSDBDriver.PROPERTY_KEY_TIMESTAMP_FORMAT).trim().toUpperCase());
|
TimestampFormat timestampFormat = TimestampFormat.valueOf(conn.getClientInfo(TSDBDriver.PROPERTY_KEY_TIMESTAMP_FORMAT).trim().toUpperCase());
|
||||||
String url;
|
String url;
|
||||||
|
|
||||||
switch (timestampFormat) {
|
switch (timestampFormat) {
|
||||||
case TIMESTAMP:
|
case TIMESTAMP:
|
||||||
url = "http://" + conn.getHost() + ":" + conn.getPort() + "/rest/sqlt";
|
url = "http://" + conn.getHost() + ":" + conn.getPort() + "/rest/sqlt" + dbname;
|
||||||
break;
|
break;
|
||||||
case UTC:
|
case UTC:
|
||||||
url = "http://" + conn.getHost() + ":" + conn.getPort() + "/rest/sqlutc";
|
url = "http://" + conn.getHost() + ":" + conn.getPort() + "/rest/sqlutc" + dbname;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
url = "http://" + conn.getHost() + ":" + conn.getPort() + "/rest/sql";
|
url = "http://" + conn.getHost() + ":" + conn.getPort() + "/rest/sql" + dbname;
|
||||||
}
|
}
|
||||||
return url;
|
return url;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,101 @@
|
||||||
|
package com.taosdata.jdbc.cases;
|
||||||
|
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.sql.*;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.IntStream;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertNotNull;
|
||||||
|
|
||||||
|
public class MultiConnectionWithDifferentDbTest {
|
||||||
|
|
||||||
|
private static String host = "127.0.0.1";
|
||||||
|
private static String db1 = "db1";
|
||||||
|
private static String db2 = "db2";
|
||||||
|
|
||||||
|
private long ts;
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test() {
|
||||||
|
List<Thread> threads = IntStream.range(1, 3).mapToObj(i -> new Thread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
for (int j = 0; j < 10; j++) {
|
||||||
|
queryDb();
|
||||||
|
try {
|
||||||
|
TimeUnit.SECONDS.sleep(1);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void queryDb() {
|
||||||
|
String url = "jdbc:TAOS-RS://" + host + ":6041/db" + i + "?user=root&password=taosdata";
|
||||||
|
try (Connection connection = DriverManager.getConnection(url)) {
|
||||||
|
Statement stmt = connection.createStatement();
|
||||||
|
|
||||||
|
ResultSet rs = stmt.executeQuery("select * from weather");
|
||||||
|
assertNotNull(rs);
|
||||||
|
rs.next();
|
||||||
|
long actual = rs.getTimestamp("ts").getTime();
|
||||||
|
assertEquals(ts, actual);
|
||||||
|
|
||||||
|
int f1 = rs.getInt("f1");
|
||||||
|
assertEquals(i, f1);
|
||||||
|
|
||||||
|
String loc = i == 1 ? "beijing" : "shanghai";
|
||||||
|
String loc_actual = rs.getString("loc");
|
||||||
|
assertEquals(loc, loc_actual);
|
||||||
|
|
||||||
|
stmt.close();
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, "thread-" + i)).collect(Collectors.toList());
|
||||||
|
|
||||||
|
threads.forEach(Thread::start);
|
||||||
|
|
||||||
|
for (Thread t : threads) {
|
||||||
|
try {
|
||||||
|
t.join();
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void before() {
|
||||||
|
ts = System.currentTimeMillis();
|
||||||
|
|
||||||
|
try {
|
||||||
|
Connection conn = DriverManager.getConnection("jdbc:TAOS-RS://" + host + ":6041/?user=root&password=taosdata");
|
||||||
|
|
||||||
|
Statement stmt = conn.createStatement();
|
||||||
|
stmt.execute("drop database if exists " + db1);
|
||||||
|
stmt.execute("create database if not exists " + db1);
|
||||||
|
stmt.execute("use " + db1);
|
||||||
|
stmt.execute("create table weather(ts timestamp, f1 int) tags(loc nchar(10))");
|
||||||
|
stmt.execute("insert into t1 using weather tags('beijing') values(" + ts + ", 1)");
|
||||||
|
|
||||||
|
stmt.execute("drop database if exists " + db2);
|
||||||
|
stmt.execute("create database if not exists " + db2);
|
||||||
|
stmt.execute("use " + db2);
|
||||||
|
stmt.execute("create table weather(ts timestamp, f1 int) tags(loc nchar(10))");
|
||||||
|
stmt.execute("insert into t1 using weather tags('shanghai') values(" + ts + ", 2)");
|
||||||
|
|
||||||
|
conn.close();
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,69 @@
|
||||||
|
package com.taosdata.jdbc.rs;
|
||||||
|
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.sql.*;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
public class DatabaseSpecifiedTest {
|
||||||
|
|
||||||
|
private static String host = "127.0.0.1";
|
||||||
|
private static String dbname = "test_db_spec";
|
||||||
|
|
||||||
|
private Connection connection;
|
||||||
|
private long ts;
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test() throws SQLException {
|
||||||
|
// when
|
||||||
|
connection = DriverManager.getConnection("jdbc:TAOS-RS://" + host + ":6041/" + dbname + "?user=root&password=taosdata");
|
||||||
|
try (Statement stmt = connection.createStatement();) {
|
||||||
|
ResultSet rs = stmt.executeQuery("select * from weather");
|
||||||
|
|
||||||
|
//then
|
||||||
|
assertNotNull(rs);
|
||||||
|
rs.next();
|
||||||
|
long now = rs.getTimestamp("ts").getTime();
|
||||||
|
assertEquals(ts, now);
|
||||||
|
int f1 = rs.getInt(2);
|
||||||
|
assertEquals(1, f1);
|
||||||
|
String loc = rs.getString("loc");
|
||||||
|
assertEquals("beijing", loc);
|
||||||
|
}
|
||||||
|
connection.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void before() {
|
||||||
|
ts = System.currentTimeMillis();
|
||||||
|
try {
|
||||||
|
Connection connection = DriverManager.getConnection("jdbc:TAOS-RS://" + host + ":6041/?user=root&password=taosdata");
|
||||||
|
Statement stmt = connection.createStatement();
|
||||||
|
|
||||||
|
stmt.execute("drop database if exists " + dbname);
|
||||||
|
stmt.execute("create database if not exists " + dbname);
|
||||||
|
stmt.execute("use " + dbname);
|
||||||
|
stmt.execute("create table weather(ts timestamp, f1 int) tags(loc nchar(10))");
|
||||||
|
stmt.execute("insert into t1 using weather tags('beijing') values( " + ts + ", 1)");
|
||||||
|
|
||||||
|
stmt.close();
|
||||||
|
connection.close();
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void after() {
|
||||||
|
try {
|
||||||
|
if (connection != null)
|
||||||
|
connection.close();
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -7957,12 +7957,12 @@ static int insertTestProcess() {
|
||||||
end = taosGetTimestampMs();
|
end = taosGetTimestampMs();
|
||||||
|
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"Spent %.4f seconds to create %"PRId64" table(s) with %d thread(s), actual %"PRId64" table(s) created\n\n",
|
"\nSpent %.4f seconds to create %"PRId64" table(s) with %d thread(s), actual %"PRId64" table(s) created\n\n",
|
||||||
(end - start)/1000.0, g_totalChildTables,
|
(end - start)/1000.0, g_totalChildTables,
|
||||||
g_Dbs.threadCountByCreateTbl, g_actualChildTables);
|
g_Dbs.threadCountByCreateTbl, g_actualChildTables);
|
||||||
if (g_fpOfInsertResult) {
|
if (g_fpOfInsertResult) {
|
||||||
fprintf(g_fpOfInsertResult,
|
fprintf(g_fpOfInsertResult,
|
||||||
"Spent %.4f seconds to create %"PRId64" table(s) with %d thread(s), actual %"PRId64" table(s) created\n\n",
|
"\nSpent %.4f seconds to create %"PRId64" table(s) with %d thread(s), actual %"PRId64" table(s) created\n\n",
|
||||||
(end - start)/1000.0, g_totalChildTables,
|
(end - start)/1000.0, g_totalChildTables,
|
||||||
g_Dbs.threadCountByCreateTbl, g_actualChildTables);
|
g_Dbs.threadCountByCreateTbl, g_actualChildTables);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue