diff --git a/integration-tests/mysql-client-tests/c/mysql-connector-c-test.c b/integration-tests/mysql-client-tests/c/mysql-connector-c-test.c index a1a4f2c9c4..4026aa5edd 100644 --- a/integration-tests/mysql-client-tests/c/mysql-connector-c-test.c +++ b/integration-tests/mysql-client-tests/c/mysql-connector-c-test.c @@ -3,7 +3,7 @@ #include #include -#define QUERIES_SIZE 5 +#define QUERIES_SIZE 14 char *queries[QUERIES_SIZE] = { @@ -11,7 +11,16 @@ char *queries[QUERIES_SIZE] = "describe test", "select * from test", "insert into test (pk, `value`) values (0,0)", - "select * from test" + "select * from test", + "select dolt_add('-A');", + "select dolt_commit('-m', 'my commit')", + "select COUNT(*) FROM dolt_log", + "select dolt_checkout('-b', 'mybranch')", + "insert into test (pk, `value`) values (10,10)", + "select dolt_commit('-a', '-m', 'my commit2')", + "select dolt_checkout('main')", + "select dolt_merge('mybranch')", + "select COUNT(*) FROM dolt_log", }; typedef struct statement_t { diff --git a/integration-tests/mysql-client-tests/cpp/mysql-connector-cpp-test.cpp b/integration-tests/mysql-client-tests/cpp/mysql-connector-cpp-test.cpp index 3d61c1b3d0..3ae4a63418 100644 --- a/integration-tests/mysql-client-tests/cpp/mysql-connector-cpp-test.cpp +++ b/integration-tests/mysql-client-tests/cpp/mysql-connector-cpp-test.cpp @@ -24,7 +24,7 @@ #include "cppconn/prepared_statement.h" #include "cppconn/variant.h" -#define QUERIES_SIZE 5 +#define QUERIES_SIZE 14 std::string queries[QUERIES_SIZE] = { @@ -32,10 +32,19 @@ std::string queries[QUERIES_SIZE] = "describe test", "select * from test", "insert into test (pk, `value`) values (0,0)", - "select * from test" + "select * from test", + "select dolt_add('-A');", + "select dolt_commit('-m', 'my commit')", + "select COUNT(*) FROM dolt_log", + "select dolt_checkout('-b', 'mybranch')", + "insert into test (pk, `value`) values (1,1)", + "select dolt_commit('-a', '-m', 'my commit2')", + "select dolt_checkout('main')", + "select dolt_merge('mybranch')", + "select COUNT(*) FROM dolt_log", }; -int is_update[QUERIES_SIZE] = {0,0,0,1,0}; +int is_update[QUERIES_SIZE] = {0,0,0,1,0,0,0,0,0,1,0,0,0,0}; int main(int argc, char **argv) { std::string user = argv[1]; diff --git a/integration-tests/mysql-client-tests/dotnet/MySqlClient/Program.cs b/integration-tests/mysql-client-tests/dotnet/MySqlClient/Program.cs index 3e7f7c6831..cb039dbdfe 100644 --- a/integration-tests/mysql-client-tests/dotnet/MySqlClient/Program.cs +++ b/integration-tests/mysql-client-tests/dotnet/MySqlClient/Program.cs @@ -78,4 +78,48 @@ public class DoltSQL Console.WriteLine(ex.ToString()); } } + + public static void DoltSqlTest(MySqlConnection conn) + { + string[] queries = new string[] { + "select dolt_add('-A');", + "select dolt_commit('-m', 'my commit')", + "select dolt_checkout('-b', 'mybranch')", + "insert into test (pk, `value`) values (1,1)", + "select dolt_commit('-a', '-m', 'my commit2')", + "select dolt_checkout('main')", + "select dolt_merge('mybranch')", + }; + + for (int i = 0; i < queries.Length ; i++) { + try + { + var cmd = new MySqlCommand(queries[i], conn); + cmd.ExecuteScalar(); + } + catch (Exception ex) + { + Console.WriteLine(ex.ToString()); + } + } + + var finalCmd = new MySqlCommand("select COUNT(*) FROM dolt_log", conn); + try + { + object result = finalCmd.ExecuteScalar(); + if (result != null) + { + int r = Convert.ToInt32(result); + if (r != 3) + { + TestException ex = new TestException($"Expected 3, Recieved {r}"); + throw ex; + } + } + } + catch (Exception ex) + { + Console.WriteLine(ex.ToString()); + } + } } diff --git a/integration-tests/mysql-client-tests/dotnet/MySqlConnector/Program.cs b/integration-tests/mysql-client-tests/dotnet/MySqlConnector/Program.cs index a0cc89b6df..fa595cb825 100755 --- a/integration-tests/mysql-client-tests/dotnet/MySqlConnector/Program.cs +++ b/integration-tests/mysql-client-tests/dotnet/MySqlConnector/Program.cs @@ -35,6 +35,7 @@ namespace MySqlConnectorTest { QueryTest(conn); } + DoltSqlTest(conn); } catch (Exception ex) { @@ -82,5 +83,49 @@ namespace MySqlConnectorTest Console.WriteLine(ex.ToString()); } } + + public static void DoltSqlTest(MySqlConnection conn) + { + string[] queries = new string[] { + "select dolt_add('-A');", + "select dolt_commit('-m', 'my commit')", + "select dolt_checkout('-b', 'mybranch')", + "insert into test (pk, `value`) values (1,1)", + "select dolt_commit('-a', '-m', 'my commit2')", + "select dolt_checkout('main')", + "select dolt_merge('mybranch')", + }; + + for (int i = 0; i < queries.Length ; i++) { + try + { + var cmd = new MySqlCommand(queries[i], conn); + cmd.ExecuteScalar(); + } + catch (Exception ex) + { + Console.WriteLine(ex.ToString()); + } + } + + var finalCmd = new MySqlCommand("select COUNT(*) FROM dolt_log", conn); + try + { + object result = finalCmd.ExecuteScalar(); + if (result != null) + { + int r = Convert.ToInt32(result); + if (r != 3) + { + TestException ex = new TestException($"Expected 3, Recieved {r}"); + throw ex; + } + } + } + catch (Exception ex) + { + Console.WriteLine(ex.ToString()); + } + } } } diff --git a/integration-tests/mysql-client-tests/elixir/lib/simple.ex b/integration-tests/mysql-client-tests/elixir/lib/simple.ex index 400973640c..1ce24ba528 100644 --- a/integration-tests/mysql-client-tests/elixir/lib/simple.ex +++ b/integration-tests/mysql-client-tests/elixir/lib/simple.ex @@ -32,5 +32,18 @@ defmodule SmokeTest do {:ok, result} = MyXQL.query(pid, "SELECT * FROM test") myTestFunc(result.num_rows, 1) myTestFunc(result.rows, [[0,0]]) + + {:ok, _} = MyXQL.query(pid, "select dolt_add('-A');") + {:ok, _} = MyXQL.query(pid, "select dolt_commit('-m', 'my commit')") + {:ok, _} = MyXQL.query(pid, "select COUNT(*) FROM dolt_log") + {:ok, _} = MyXQL.query(pid, "select dolt_checkout('-b', 'mybranch')") + {:ok, _} = MyXQL.query(pid, "insert into test (pk, `value`) values (1,1)") + {:ok, _} = MyXQL.query(pid, "select dolt_commit('-a', '-m', 'my commit2')") + {:ok, _} = MyXQL.query(pid, "select dolt_checkout('main')") + {:ok, _} = MyXQL.query(pid, "select dolt_merge('mybranch')") + + {:ok, result} = MyXQL.query(pid, "select COUNT(*) FROM dolt_log") + myTestFunc(result.num_rows, 1) + myTestFunc(result.rows, [[3]]) end end diff --git a/integration-tests/mysql-client-tests/go/go-sql-driver-mysql-test.go b/integration-tests/mysql-client-tests/go/go-sql-driver-mysql-test.go index 86873846c6..1b809227ea 100644 --- a/integration-tests/mysql-client-tests/go/go-sql-driver-mysql-test.go +++ b/integration-tests/mysql-client-tests/go/go-sql-driver-mysql-test.go @@ -8,12 +8,19 @@ import ( _ "github.com/go-sql-driver/mysql" ) -var queries [5]string = [5]string{ +var queries = [12]string{ "create table test (pk int, `value` int, primary key(pk))", "describe test", "select * from test", "insert into test (pk, `value`) values (0,0)", - "select * from test"} + "select * from test", + "select dolt_add('-A')", + "select dolt_commit('-m', 'added table test')", + "select dolt_checkout('-b', 'mybranch')", + "insert into test values (1,1)", + "select dolt_commit('-a', '-m', 'updated test')", + "select dolt_checkout('main')", + "select dolt_merge('mybranch')"} type ResFunc func(rows *sql.Rows) error @@ -40,6 +47,36 @@ var stmtTests []StmtTest = []StmtTest{ }, }, }, + { + Query: "SELECT COUNT(*) FROM dolt_log", + Res: []ResFunc{ + func(rows *sql.Rows) error { + var size int64 + if err := rows.Scan(&size); err != nil { + return err + } + if size != 3 { + return fmt.Errorf("Unexpected values for size: %d", size) + } + return nil + }, + }, + }, + { + Query: "select count(*) from test", + Res: []ResFunc{ + func(rows *sql.Rows) error { + var size int64 + if err := rows.Scan(&size); err != nil { + return err + } + if size != 2 { + return fmt.Errorf("Unexpected values for size: %d", size) + } + return nil + }, + }, + }, } func main() { diff --git a/integration-tests/mysql-client-tests/java/MySQLConnectorTest.java b/integration-tests/mysql-client-tests/java/MySQLConnectorTest.java index 3c659dd130..130571ff96 100644 --- a/integration-tests/mysql-client-tests/java/MySQLConnectorTest.java +++ b/integration-tests/mysql-client-tests/java/MySQLConnectorTest.java @@ -26,7 +26,16 @@ public class MySQLConnectorTest { "describe test", "select * from test", "insert into test (pk, `value`) values (0,0)", - "select * from test" + "select * from test", + "select dolt_add('-A')", + "select dolt_commit('-m', 'my commit')", + "select COUNT(*) FROM dolt_log", + "select dolt_checkout('-b', 'mybranch')", + "insert into test (pk, `value`) values (1,1)", + "select dolt_commit('-a', '-m', 'my commit2')", + "select dolt_checkout('main')", + "select dolt_merge('mybranch')", + "select COUNT(*) FROM dolt_log", }; // Only test the first row, column pair for now @@ -35,7 +44,16 @@ public class MySQLConnectorTest { "pk", null, "1", - "0" + "0", + "0", + "0", + "2", + "0", + "1", + "1", + "0", + "1", + "3" }; for (int i = 0; i < queries.length; i++) { @@ -45,7 +63,7 @@ public class MySQLConnectorTest { ResultSet rs = st.getResultSet(); if (rs.next()) { String result = rs.getString(1); - if ( !expected.equals(result) ) { + if (!expected.equals(result) && !(query.contains("dolt_commit"))) { System.out.println("Query: \n" + query); System.out.println("Expected:\n" + expected); System.out.println("Result:\n" + result); diff --git a/integration-tests/mysql-client-tests/node/index.js b/integration-tests/mysql-client-tests/node/index.js index 59fff69c36..938688f4a5 100644 --- a/integration-tests/mysql-client-tests/node/index.js +++ b/integration-tests/mysql-client-tests/node/index.js @@ -45,7 +45,16 @@ async function main() { "describe test", "select * from test", "insert into test (pk, `value`) values (0,0)", - "select * from test" + "select * from test", + "select dolt_add('-A');", + "select dolt_commit('-m', 'my commit')", + "select COUNT(*) FROM dolt_log", + "select dolt_checkout('-b', 'mybranch')", + "insert into test (pk, `value`) values (1,1)", + "select dolt_commit('-a', '-m', 'my commit2')", + "select dolt_checkout('main')", + "select dolt_merge('mybranch')", + "select COUNT(*) FROM dolt_log", ]; const results = [ @@ -74,7 +83,25 @@ async function main() { protocol41: true, changedRows: 0 }, - [ { pk: 0, value: 0 } ] + [ { pk: 0, value: 0 } ], + [ { "dolt_add('-A')": 0 } ], + [], + [ { "COUNT(*)": 2 } ], + [ { "dolt_checkout('-b', 'mybranch')": 0 } ], + { + fieldCount: 0, + affectedRows: 1, + insertId: 0, + serverStatus: 2, + warningCount: 0, + message: '', + protocol41: true, + changedRows: 0 + }, + [], + [ { "dolt_checkout('main')": 0 } ], + [ { "dolt_merge('mybranch')": 1 } ], + [ { "COUNT(*)": 3 } ], ]; const database = new Database(config); @@ -84,7 +111,7 @@ async function main() { return database.query(query).then(rows => { const resultStr = JSON.stringify(rows); const result = JSON.parse(resultStr); - if (resultStr !== JSON.stringify(expected) ) { + if (resultStr !== JSON.stringify(expected) && !(query.includes("dolt_commit"))) { console.log("Query:", query); console.log("Results:", result); console.log("Expected:", expected); diff --git a/integration-tests/mysql-client-tests/perl/dbd-mysql-test.pl b/integration-tests/mysql-client-tests/perl/dbd-mysql-test.pl index f4e6aba589..6368ef4b9a 100644 --- a/integration-tests/mysql-client-tests/perl/dbd-mysql-test.pl +++ b/integration-tests/mysql-client-tests/perl/dbd-mysql-test.pl @@ -6,8 +6,16 @@ my $QUERY_RESPONSE = [ { "create table test (pk int, `value` int, primary key(pk))" => '0E0' }, { "describe test" => 2 }, { "insert into test (pk, `value`) values (0,0)" => 1 }, - { "select * from test" => 1 } - ]; + { "select * from test" => 1 }, + {"select dolt_add('-A');" => 1 }, + {"select dolt_commit('-m', 'my commit')" => 1}, + {"select dolt_checkout('-b', 'mybranch')" => 1 }, + {"insert into test (pk, `value`) values (1,1)" => 1 }, + {"select dolt_commit('-a', '-m', 'my commit2')" => 1 }, + {"select dolt_checkout('main')" => 1 }, + {"select dolt_merge('mybranch')" => 1 }, + {"select COUNT(*) FROM dolt_log" => 1 }, +]; my $user = $ARGV[0]; my $port = $ARGV[1]; diff --git a/integration-tests/mysql-client-tests/python/mysql.connector-test.py b/integration-tests/mysql-client-tests/python/mysql.connector-test.py index a13f08bf04..d8b8167a33 100644 --- a/integration-tests/mysql-client-tests/python/mysql.connector-test.py +++ b/integration-tests/mysql-client-tests/python/mysql.connector-test.py @@ -2,25 +2,36 @@ import mysql.connector import sys QUERY_RESPONSE = [ - { "create table test (pk int, `value` int, primary key(pk))": [] }, - { "describe test": [ + {"create table test (pk int, `value` int, primary key(pk))": []}, + {"describe test": [ ('pk', 'int', 'NO', 'PRI', '', ''), ('value', 'int', 'YES', '', '', '') - ] }, - { "insert into test (pk, `value`) values (0,0)": [] }, - { "select * from test": [(0,0)] }, + ]}, + {"insert into test (pk, `value`) values (0,0)": []}, + {"select * from test": [(0, 0)]}, # We used to have a bug where spaces after a semicolon in a query # would cause a client/server disconnect. # https://github.com/dolthub/vitess/pull/65 # The following regression tests it. - { "select * from test; ": [(0,0)] }, - { "select * from test; ": [(0,0)] }, + {"select * from test; ": [(0, 0)]}, + {"select * from test; ": [(0, 0)]}, + # Test the Dolt SQL functions + {"select dolt_add('-A');": [(0,)]}, + {"select dolt_commit('-m', 'my commit')": [('',)]}, + {"select COUNT(*) FROM dolt_log": [(2,)]}, + {"select dolt_checkout('-b', 'mybranch')": [(0,)]}, + {"insert into test (pk, `value`) values (1,1)": []}, + {"select dolt_commit('-a', '-m', 'my commit2')": [('',)]}, + {"select dolt_checkout('main')": [(0,)]}, + {"select dolt_merge('mybranch')": [(1,)]}, + {"select COUNT(*) FROM dolt_log": [(3,)]}, ] - + + def main(): user = sys.argv[1] port = sys.argv[2] - db = sys.argv[3] + db = sys.argv[3] connection = mysql.connector.connect(user=user, host="127.0.0.1", @@ -29,14 +40,14 @@ def main(): for query_response in QUERY_RESPONSE: query = list(query_response.keys())[0] - exp_results = query_response[query] + exp_results = query_response[query] cursor = connection.cursor() cursor.execute(query) - try: + try: results = cursor.fetchall() print(exp_results) print(results) - if ( results != exp_results ): + if (results != exp_results) and ("dolt_commit" not in query): print("Query:") print(query) print("Expected:") @@ -45,13 +56,15 @@ def main(): print(results) exit(1) except mysql.connector.errors.InterfaceError: + # This is a write query pass - + cursor.close() - + connection.close() - + exit(0) + main() diff --git a/integration-tests/mysql-client-tests/python/pymysql-test.py b/integration-tests/mysql-client-tests/python/pymysql-test.py index 9334566d2f..6649afa7ab 100644 --- a/integration-tests/mysql-client-tests/python/pymysql-test.py +++ b/integration-tests/mysql-client-tests/python/pymysql-test.py @@ -2,20 +2,30 @@ import pymysql import sys QUERY_RESPONSE = [ - { "create table test (pk int, `value` int, primary key(pk))": () }, - { "describe test": ( + {"create table test (pk int, `value` int, primary key(pk))": ()}, + {"describe test": ( ('pk', 'int', 'NO', 'PRI', '', ''), ('value', 'int', 'YES', '', '', '') - ) }, - { "insert into test (pk, `value`) values (0,0)": () }, - { "select * from test": ((0,0),) } + )}, + {"insert into test (pk, `value`) values (0,0)": ()}, + {"select * from test": ((0, 0),)}, + {"select dolt_add('-A');": ((0,),)}, + {"select dolt_commit('-m', 'my commit')": (('',),)}, + {"select COUNT(*) FROM dolt_log": ((2,),)}, + {"select dolt_checkout('-b', 'mybranch')": ((0,),)}, + {"insert into test (pk, `value`) values (1,1)": ()}, + {"select dolt_commit('-a', '-m', 'my commit2')": (('',),)}, + {"select dolt_checkout('main')": ((0,),)}, + {"select dolt_merge('mybranch')": ((1,),)}, + {"select COUNT(*) FROM dolt_log": ((3,),)}, ] - + + def main(): user = sys.argv[1] port = int(sys.argv[2]) - db = sys.argv[3] - + db = sys.argv[3] + connection = pymysql.connect(host="127.0.0.1", port=port, user=user, @@ -27,7 +37,7 @@ def main(): with connection.cursor() as cursor: cursor.execute(query) results = cursor.fetchall() - if ( results != exp_results ): + if (results != exp_results) and ("dolt_commit" not in query): print("Query:") print(query) print("Expected:") @@ -37,7 +47,8 @@ def main(): exit(1) connection.close() - + exit(0) + main() diff --git a/integration-tests/mysql-client-tests/python/sqlalchemy-test.py b/integration-tests/mysql-client-tests/python/sqlalchemy-test.py index 6fcee84347..1bca1b3033 100644 --- a/integration-tests/mysql-client-tests/python/sqlalchemy-test.py +++ b/integration-tests/mysql-client-tests/python/sqlalchemy-test.py @@ -6,19 +6,29 @@ from sqlalchemy import create_engine import sys QUERY_RESPONSE = [ - { "create table test (pk int, `value` int, primary key(pk))": [] }, - { "describe test": [ + {"create table test (pk int, `value` int, primary key(pk))": []}, + {"describe test": [ ('pk', 'int', 'NO', 'PRI', '', ''), ('value', 'int', 'YES', '', '', '') - ] }, - { "insert into test (pk, `value`) values (0,0)": () }, - { "select * from test": [(0,0)] } + ]}, + {"insert into test (pk, `value`) values (0,0)": ()}, + {"select * from test": [(0, 0)]}, + {"select dolt_add('-A');": [(0,)]}, + {"select dolt_commit('-m', 'my commit')": [('',)]}, + {"select COUNT(*) FROM dolt_log": [(2,)]}, + {"select dolt_checkout('-b', 'mybranch')": [(0,)]}, + {"insert into test (pk, `value`) values (1,1)": []}, + {"select dolt_commit('-a', '-m', 'my commit2')": [('',)]}, + {"select dolt_checkout('main')": [(0,)]}, + {"select dolt_merge('mybranch')": [(1,)]}, + {"select COUNT(*) FROM dolt_log": [(3,)]}, ] - + + def main(): user = sys.argv[1] port = int(sys.argv[2]) - db = sys.argv[3] + db = sys.argv[3] conn_string_base = "mysql+mysqlconnector://" @@ -26,18 +36,18 @@ def main(): "{user}@127.0.0.1:{port}/{db}".format(user=user, port=port, db=db) - ) + ) with engine.connect() as con: for query_response in QUERY_RESPONSE: query = list(query_response.keys())[0] exp_results = query_response[query] - + result_proxy = con.execute(query) - + try: results = result_proxy.fetchall() - if ( results != exp_results ): + if (results != exp_results) and ("dolt_commit" not in query): print("Query:") print(query) print("Expected:") @@ -53,4 +63,5 @@ def main(): con.close() exit(0) + main() diff --git a/integration-tests/mysql-client-tests/r/rmariadb-test.r b/integration-tests/mysql-client-tests/r/rmariadb-test.r index e23cf03394..890ab6bfa4 100644 --- a/integration-tests/mysql-client-tests/r/rmariadb-test.r +++ b/integration-tests/mysql-client-tests/r/rmariadb-test.r @@ -55,3 +55,24 @@ if (!isTRUE(all.equal(want, got))) { print(rows) quit(1) } + +dolt_queries = list("SELECT DOLT_ADD('-A')", + "select dolt_commit('-m', 'my commit')", + "select dolt_checkout('-b', 'mybranch')", + "insert into test (pk, `value`) values (2,2)", + "select dolt_commit('-a', '-m', 'my commit2')", + "select dolt_checkout('main')", + "select dolt_merge('mybranch')") + +for(i in 1:length(dolt_queries)) { + q = dolt_queries[[i]] + dbExecute(conn, q) +} + +count <- dbGetQuery(conn, "select COUNT(*) as c from dolt_log") +want <- data.frame(c = c(3)) +ret <- all.equal(count, want) +if (!ret) { + print("Number of commits is incorrect") + quit(1) +} diff --git a/integration-tests/mysql-client-tests/r/rmysql-test.r b/integration-tests/mysql-client-tests/r/rmysql-test.r index b75dd8b26b..96b94cddb5 100644 --- a/integration-tests/mysql-client-tests/r/rmysql-test.r +++ b/integration-tests/mysql-client-tests/r/rmysql-test.r @@ -36,3 +36,24 @@ for(i in 1:length(queries)) { dbExecute(conn, q) } } + +dolt_queries = list("SELECT DOLT_ADD('-A')", + "select dolt_commit('-m', 'my commit')", + "select dolt_checkout('-b', 'mybranch')", + "insert into test (pk, `value`) values (1,1)", + "select dolt_commit('-a', '-m', 'my commit2')", + "select dolt_checkout('main')", + "select dolt_merge('mybranch')") + +for(i in 1:length(dolt_queries)) { + q = dolt_queries[[i]] + dbExecute(conn, q) +} + +count <- dbGetQuery(conn, "select COUNT(*) as c from dolt_log") +want <- data.frame(c = c(3)) +ret <- all.equal(count, want) +if (!ret) { + print("Number of commits is incorrect") + quit(1) +} diff --git a/integration-tests/mysql-client-tests/ruby/ruby-mysql-test.rb b/integration-tests/mysql-client-tests/ruby/ruby-mysql-test.rb index e990a6e5d0..e2ebe3cb8b 100644 --- a/integration-tests/mysql-client-tests/ruby/ruby-mysql-test.rb +++ b/integration-tests/mysql-client-tests/ruby/ruby-mysql-test.rb @@ -11,7 +11,16 @@ queries = [ "describe test", "select * from test", "insert into test (pk, `value`) values (0,0)", - "select * from test" + "select * from test", + "select dolt_add('-A');", + "select dolt_commit('-m', 'my commit')", + "select COUNT(*) FROM dolt_log", + "select dolt_checkout('-b', 'mybranch')", + "insert into test (pk, `value`) values (1,1)", + "select dolt_commit('-a', '-m', 'my commit2')", + "select dolt_checkout('main')", + "select dolt_merge('mybranch')", + "select COUNT(*) FROM dolt_log", ] conn = Mysql::new("127.0.0.1", user, "", db, port)