Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
fa12954
feat:support expaln statement for SCDB(#478)
zhuyanhuazhuyanhua Aug 9, 2025
84ea160
Merge branch 'secretflow:main' into main
zhuyanhuazhuyanhua Aug 9, 2025
14410ef
feat:handle explain in runSQL
zhuyanhuazhuyanhua Aug 11, 2025
71b7164
Feat:imply with runSQL
zhuyanhuazhuyanhua Aug 11, 2025
6e00a83
Merge branch 'main' into main
Candicepan Aug 22, 2025
478cab1
Feat:fix and imply in submitAndGet
zhuyanhuazhuyanhua Aug 26, 2025
6183c85
Merge branch 'main' of https://github.com/zhuyanhuazhuyanhua/scql
zhuyanhuazhuyanhua Aug 26, 2025
b92dbc6
Merge branch 'main' into main
Candicepan Aug 28, 2025
eb23b93
Feat:add isexplain test and fix submitandget
zhuyanhuazhuyanhua Aug 29, 2025
a08f5f6
Merge branch 'main' of https://github.com/zhuyanhuazhuyanhua/scql
zhuyanhuazhuyanhua Aug 29, 2025
19c9397
Feat:support select and union state in buildexplain
zhuyanhuazhuyanhua Sep 1, 2025
2a9615b
Feat:imply explain in 3 steps
zhuyanhuazhuyanhua Sep 6, 2025
8f5ee99
bug:fix bug in scdb_api.swagger.yaml
zhuyanhuazhuyanhua Sep 7, 2025
b742b93
Feat:store expalin in OutColumns instead of Status
zhuyanhuazhuyanhua Sep 9, 2025
034c377
Feat:fix SubmitAndGet in api\scdb_api.proto
zhuyanhuazhuyanhua Sep 9, 2025
c7030f3
Feat:imply explain in runSQL
zhuyanhuazhuyanhua Sep 15, 2025
1b24bbf
Feat:imply in runSQL
zhuyanhuazhuyanhua Sep 19, 2025
258d1f3
undo:imply explain in runDQL
zhuyanhuazhuyanhua Sep 25, 2025
8c6f668
Feat:imply in runSQL
zhuyanhuazhuyanhua Sep 28, 2025
9fde404
feat: add test
zhuyanhuazhuyanhua Sep 28, 2025
757e034
feat:add explain test func
zhuyanhuazhuyanhua Sep 29, 2025
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
2 changes: 1 addition & 1 deletion api/scdb_api.proto
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ service SCDBService {
// This interface is suitable for executing fast queries,
// such as DDL, DCL, and simple DQL. However,
// if the query takes a long time to run, it may result in a timeout.
// Therefore, it is recommended to use the synchronous query API to run
// Therefore, it is recommended to use the asynchronous query API to run
// complex queries.
rpc SubmitAndGet(SCDBQueryRequest) returns (SCDBQueryResultResponse) {
option (google.api.http) = {
Expand Down
42 changes: 42 additions & 0 deletions cmd/regtest/scdb/scdb_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,26 @@ func TestSCDBWithAllCCLPlaintext(t *testing.T) {
}
}

func TestSCDBWithExplain(t *testing.T) {
r := require.New(t)
addresses, err := getUrlList(testConf)
r.NoError(err)
protocols, err := getProtocols(testConf)
r.NoError(err)
mockTables, err := mock.MockAllTables()
r.NoError(err)
regtest.FillTableToPartyCodeMap(mockTables)

cclList, err := mock.MockAllCCL()
r.NoError(err)
for i, addr := range addresses {
fmt.Printf("test explain with protocol %s\n", protocols[i])
r.NoError(createUserAndCcl(testConf, cclList, addresses[i], testConf.SkipCreateUserCCL))
r.NoError(runExplainTest(userNameAlice, addr, protocols[i], testFlag{sync: true, testConcurrent: !testConf.SkipConcurrentTest, testSerial: true}))
r.NoError(runExplainTest(userNameAlice, addr, protocols[i], testFlag{sync: false, testConcurrent: !testConf.SkipConcurrentTest, testSerial: false}))
}
}

func runQueryTest(user, addr string, protocol string, flags testFlag) (err error) {
path := map[string][]string{SEMI2K: {"../testdata/single_party.json", "../testdata/two_parties.json", "../testdata/multi_parties.json", "../testdata/view.json"}, CHEETAH: {"../testdata/two_parties.json"}, ABY3: {"../testdata/multi_parties.json"}}
for _, fileName := range path[protocol] {
Expand All @@ -242,6 +262,28 @@ func runQueryTest(user, addr string, protocol string, flags testFlag) (err error
return nil
}

func runExplainTest(user, addr string, protocol string, flags testFlag) (err error) {
path := map[string][]string{
SEMI2K: {"../testdata/explain_single_party.json", "../testdata/explain_two_parties.json", "../testdata/explain_multi_parties.json"},
CHEETAH: {"../testdata/explain_two_parties.json"},
ABY3: {"../testdata/explain_multi_parties.json"},
}

for _, fileName := range path[protocol] {
if flags.testSerial {
if err := testCaseForSerial(fileName, flags.sync, addr, user); err != nil {
return err
}
}
if flags.testConcurrent {
if err := testCaseForConcurrent(fileName, flags.sync, addr, user); err != nil {
return err
}
}
}
return nil
}

func testCaseForSerial(dataPath string, sync bool, addr, issuerUser string) error {
var suit regtest.QueryTestSuit
if err := createSuit(dataPath, &suit); err != nil {
Expand Down
2 changes: 1 addition & 1 deletion cmd/regtest/test_util.go
Original file line number Diff line number Diff line change
Expand Up @@ -404,7 +404,7 @@ func (ds *TestDataSource) getQueryResultFromMySQL(query string, needConvertDateT
case "INT", "BIGINT", "MEDIUMINT":
var a sql.NullInt64
curRowColumns[i] = &a
case "VARCHAR", "TEXT", "NVARCHAR", "LONGTEXT", "DATETIME", "DURATION", "TIMESTAMP", "DATE":
case "VARCHAR", "TEXT", "NVARCHAR", "LONGTEXT", "MEDIUMTEXT", "DATETIME", "DURATION", "TIMESTAMP", "DATE":
var a sql.NullString
curRowColumns[i] = &a
case "BOOL":
Expand Down
109 changes: 109 additions & 0 deletions cmd/regtest/testdata/explain_multi_parties.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
{
"queries": [
{
"name": "join on",
"query": "explain select alice.encrypt_float_1 from alice_tbl_0 as alice join bob_tbl_0 as bob on alice.join_int_0 = bob.join_int_0 join carol_tbl_0 as carol on bob.join_int_1 = carol.join_int_1;",
"mysql_query": "select alice.encrypt_float_1 from alice.tbl_0 as alice join bob.tbl_0 as bob on alice.join_int_0 = bob.join_int_0 join carol.tbl_0 as carol on bob.join_int_1 = carol.join_int_1;"
},
{
"name": "join where",
"query": "explain select alice.encrypt_float_1 from alice_tbl_0 as alice, bob_tbl_0 as bob, carol_tbl_0 as carol where alice.join_int_0 = bob.join_int_0 and bob.join_int_1 = carol.join_int_1;",
"mysql_query": "select alice.encrypt_float_1 from alice.tbl_0 as alice, bob.tbl_0 as bob, carol.tbl_0 as carol where alice.join_int_0 = bob.join_int_0 and bob.join_int_1 = carol.join_int_1;"
},
{
"name": "join arithmetics",
"query": "explain select alice.plain_int_0 + bob.join_int_0 + carol.join_int_0 as add_res, alice.plain_int_0 - bob.join_int_0 - carol.join_int_0 as minus_res, alice.plain_int_0 * bob.join_int_0 * carol.join_int_0 as multi_res, alice.plain_int_0 / bob.join_int_0/ carol.join_int_0 as div_res from alice_tbl_0 as alice, bob_tbl_0 as bob, carol_tbl_0 as carol where alice.join_int_0 = bob.join_int_0 and bob.join_int_0 = carol.join_int_0 and bob.join_int_0 != 0 and carol.join_int_0 != 0;",
"mysql_query": "select alice.plain_int_0 + bob.join_int_0 + carol.join_int_0 as add_res, alice.plain_int_0 - bob.join_int_0 - carol.join_int_0 as minus_res, alice.plain_int_0 * bob.join_int_0 * carol.join_int_0 as multi_res, alice.plain_int_0 / bob.join_int_0 / carol.join_int_0 as div_res from alice.tbl_0 as alice, bob.tbl_0 as bob, carol.tbl_0 as carol where alice.join_int_0 = bob.join_int_0 and bob.join_int_0 = carol.join_int_0 and bob.join_int_0 != 0 and carol.join_int_0 != 0;"
},
{
"name": "join compare",
"query": "explain select alice.plain_int_0 > bob.join_int_0 as greater_res, alice.plain_int_0 < carol.join_int_0 as less_res, alice.plain_int_0 = carol.join_int_0 as equal_res, alice.plain_int_0 != carol.join_int_0 as unequal_res from alice_tbl_0 as alice, bob_tbl_0 as bob, carol_tbl_0 as carol where alice.join_int_0 = bob.join_int_0 and bob.join_int_0 = carol.join_int_0;",
"mysql_query": "select alice.plain_int_0 > bob.join_int_0 as greater_res, alice.plain_int_0 < carol.join_int_0 as less_res, alice.plain_int_0 = carol.join_int_0 as equal_res, alice.plain_int_0 != carol.join_int_0 as unequal_res from alice.tbl_0 as alice, bob.tbl_0 as bob, carol.tbl_0 as carol where alice.join_int_0 = bob.join_int_0 and bob.join_int_0 = carol.join_int_0;"
},
{
"name": "join arithmetics(share) compare",
"query": "explain select (alice.compare_int_0 + bob.compare_int_0) > (bob.compare_int_0 + carol.join_int_0) as add_res, (alice.compare_int_0 - bob.compare_int_0) < (bob.compare_int_0 - carol.compare_int_0) as minus_res, (alice.compare_int_0 * bob.compare_int_0) >= (bob.compare_int_0 * carol.compare_int_0) as multi_res, (alice.compare_int_0 div bob.compare_int_0) <= (bob.compare_int_0 div carol.compare_int_0) as div_res from alice_tbl_0 as alice, bob_tbl_0 as bob, carol_tbl_0 as carol where alice.join_int_0 = bob.join_int_0 and bob.join_int_0 = carol.join_int_0 and bob.compare_int_0 != 0 and carol.compare_int_0 != 0;",
"mysql_query": "select (alice.compare_int_0 + bob.compare_int_0) > (bob.compare_int_0 + carol.join_int_0) as add_res, (alice.compare_int_0 - bob.compare_int_0) < (bob.compare_int_0 - carol.compare_int_0) as minus_res, (alice.compare_int_0 * bob.compare_int_0) >= (bob.compare_int_0 * carol.compare_int_0) as multi_res, (alice.compare_int_0 div bob.compare_int_0) <= (bob.compare_int_0 div carol.compare_int_0) as div_res from alice.tbl_0 as alice, bob.tbl_0 as bob, carol.tbl_0 as carol where alice.join_int_0 = bob.join_int_0 and bob.join_int_0 = carol.join_int_0 and bob.compare_int_0 != 0 and carol.compare_int_0 != 0;"
},
{
"name": "join arithmetics(share) equal/not equal",
"query": "explain select (alice.compare_int_0 + bob.compare_int_0) = (bob.compare_int_0 + carol.join_int_0) as add_res, (alice.compare_int_0 - bob.compare_int_0) != (bob.compare_int_0 - carol.join_int_0) as minus_res from alice_tbl_0 as alice, bob_tbl_0 as bob, carol_tbl_0 as carol where alice.join_int_0 = bob.join_int_0 and bob.join_int_0 = carol.join_int_0 and bob.compare_int_0 != 0 and carol.compare_int_0 != 0;",
"mysql_query": "select (alice.compare_int_0 + bob.compare_int_0) = (bob.compare_int_0 + carol.join_int_0) as add_res, (alice.compare_int_0 - bob.compare_int_0) != (bob.compare_int_0 - carol.join_int_0) as minus_res from alice.tbl_0 as alice, bob.tbl_0 as bob, carol.tbl_0 as carol where alice.join_int_0 = bob.join_int_0 and bob.join_int_0 = carol.join_int_0 and bob.compare_int_0 != 0 and carol.compare_int_0 != 0;"
},
{
"name": "join cast",
"query": "explain select cast(alice.plain_int_0 as decimal) as cp, cast(alice.compare_int_0 > bob.compare_int_0 as decimal) as cs from alice_tbl_0 as alice, bob_tbl_0 as bob, carol_tbl_0 as carol where alice.join_int_0 = bob.join_int_0 and bob.join_int_0 = carol.join_int_0;",
"mysql_query": "select cast(alice.plain_int_0 as decimal) as cp, cast(alice.compare_int_0 > bob.compare_int_0 as decimal) as cs from alice.tbl_0 as alice, bob.tbl_0 as bob, carol.tbl_0 as carol where alice.join_int_0 = bob.join_int_0 and bob.join_int_0 = carol.join_int_0;"
},
{
"name": "join oblivious group by",
"query": "explain select key1, key2, count(*) as c, count(distinct bob_encrypt) as cd, sum(bob_aggregate) as sb, max(carol_aggregate) as sc, min(carol_aggregate) as min_ca, avg(carol_aggregate) as avg_ca from (select bob.encrypt_int_0 as bob_encrypt, bob.aggregate_int_0 as bob_aggregate, carol.aggregate_int_0 as carol_aggregate, alice.join_int_0 as alice_join, bob.join_int_0 as bob_join, carol.join_int_0 as carol_join, alice.groupby_int_0 + bob.groupby_int_0 as key1, carol.groupby_int_0 + bob.groupby_int_0 as key2 from alice_tbl_0 as alice, bob_tbl_0 as bob, carol_tbl_0 as carol) as tt where alice_join = bob_join and bob_join = carol_join group by key1, key2;",
"mysql_query": "select alice.groupby_int_0 + bob.groupby_int_0 as key1, carol.groupby_int_0 + bob.groupby_int_0 as key2, count(*) as c, count(distinct bob.encrypt_int_0) as cd, sum(bob.aggregate_int_0) as sb, max(carol.aggregate_int_0) as sc, min(carol.aggregate_int_0) as min_ca, avg(carol.aggregate_int_0) as avg_ca from alice.tbl_0 as alice, bob.tbl_0 as bob, carol.tbl_0 as carol where alice.join_int_0 = bob.join_int_0 and bob.join_int_0 = carol.join_int_0 group by alice.groupby_int_0 + bob.groupby_int_0, carol.groupby_int_0 + bob.groupby_int_0 having count(*) > 3;"
},
{
"name": "join oblivious group by multi keys",
"query": "explain select count(*) as c, count(distinct bob.encrypt_int_0) as cd, sum(bob.aggregate_int_0) as sb, sum(carol.aggregate_int_0) as sc from alice_tbl_0 as alice, bob_tbl_0 as bob, carol_tbl_0 as carol where alice.join_int_0 = bob.join_int_0 and bob.join_int_0 = carol.join_int_0 group by alice.groupby_int_0, bob.groupby_int_0, carol.groupby_int_0, carol.groupby_string_0;",
"mysql_query": "select count(*) as c, count(distinct bob.encrypt_int_0) as cd, sum(bob.aggregate_int_0) as sb, sum(carol.aggregate_int_0) as sc from alice.tbl_0 as alice, bob.tbl_0 as bob, carol.tbl_0 as carol where alice.join_int_0 = bob.join_int_0 and bob.join_int_0 = carol.join_int_0 group by alice.groupby_int_0, bob.groupby_int_0, carol.groupby_int_0, carol.groupby_string_0 having count(*) > 3;"
},
{
"name": "join he group by",
"query": "explain select count(*) as c, sum(bob.aggregate_int_0) as sb, sum(carol.aggregate_float_0) as sc from alice_tbl_0 as alice, bob_tbl_0 as bob, carol_tbl_0 as carol where alice.join_int_0 = bob.join_int_0 and bob.join_int_0 = carol.join_int_0 group by alice.groupby_int_0;",
"mysql_query": "select count(*) as c, sum(bob.aggregate_int_0) as sb, sum(carol.aggregate_float_0) as sc from alice.tbl_0 as alice, bob.tbl_0 as bob, carol.tbl_0 as carol where alice.join_int_0 = bob.join_int_0 and bob.join_int_0 = carol.join_int_0 group by alice.groupby_int_0 having count(*) > 3;"
},
{
"name": "union all group by string",
"query": "explain select count(*) as c, groupby_string_0 from (select aggregate_int_0, groupby_string_0 from alice_tbl_0 union all select aggregate_int_0, groupby_string_0 from bob_tbl_1 union all select aggregate_int_0, groupby_string_0 from carol_tbl_2) as u group by u.groupby_string_0;",
"mysql_query": "select count(*) as c, groupby_string_0 from (select aggregate_int_0, groupby_string_0 from alice.tbl_0 union all select aggregate_int_0, groupby_string_0 from bob.tbl_1 union all select aggregate_int_0, groupby_string_0 from carol.tbl_2) as u group by u.groupby_string_0 having count(*) > 3;"
},
{
"name": "union all tests",
"query": "explain select ta.plain_int_0 from alice_tbl_0 as ta union all select tb.plain_int_0 from bob_tbl_0 as tb union all select tc.plain_int_0 from carol_tbl_0 as tc",
"mysql_query": "select ta.plain_int_0 from alice.tbl_0 as ta union all select tb.plain_int_0 from bob.tbl_0 as tb union all select tc.plain_int_0 from carol.tbl_0 as tc"
},
{
"name": "agg after union all tests",
"query": "explain select count(*) as cc, max(aggregate_int_0) as mm from (select aggregate_int_0, groupby_int_0 from alice_tbl_0 union all select aggregate_int_0, groupby_int_0 from bob_tbl_1 union all select aggregate_int_0, groupby_int_0 from carol_tbl_2) as u",
"mysql_query": "select count(*) as cc, max(aggregate_int_0) as mm from (select aggregate_int_0, groupby_int_0 from alice.tbl_0 union all select aggregate_int_0, groupby_int_0 from bob.tbl_1 union all select aggregate_int_0, groupby_int_0 from carol.tbl_2) as u"
},
{
"name": "union tests",
"query": "explain select ta.plain_int_0 from alice_tbl_0 as ta union select tb.plain_int_0 from bob_tbl_0 as tb union select tc.plain_int_0 from carol_tbl_0 as tc",
"mysql_query": "select ta.plain_int_0 from alice.tbl_0 as ta union select tb.plain_int_0 from bob.tbl_0 as tb union select tc.plain_int_0 from carol.tbl_0 as tc"
},
{
"name": "join compare",
"query": "explain select alice.plain_int_0 > bob.join_int_0 as greater_res, alice.plain_int_0 < carol.join_int_0 as less_res, alice.plain_int_0 = carol.join_int_0 as equal_res, alice.plain_int_0 != carol.join_int_0 as unequal_res from alice_tbl_0 as alice, bob_tbl_0 as bob, carol_tbl_0 as carol where alice.join_int_0 = bob.join_int_0 and bob.join_int_0 = carol.join_int_0;",
"mysql_query": "select alice.plain_int_0 > bob.join_int_0 as greater_res, alice.plain_int_0 < carol.join_int_0 as less_res, alice.plain_int_0 = carol.join_int_0 as equal_res, alice.plain_int_0 != carol.join_int_0 as unequal_res from alice.tbl_0 as alice, bob.tbl_0 as bob, carol.tbl_0 as carol where alice.join_int_0 = bob.join_int_0 and bob.join_int_0 = carol.join_int_0;"
},
{
"name": "agg after union all tests. agg(bool)",
"query": "explain select count(*) as cc, max(aggregate_int_0 > 0) as mm, min(aggregate_int_0 > 0) as mn, sum(aggregate_int_0 > 0) as su, avg(aggregate_int_0 > 0) as av from (select aggregate_int_0, groupby_int_0 from alice_tbl_0 union all select aggregate_int_0, groupby_int_0 from bob_tbl_1 union all select aggregate_int_0, groupby_int_0 from carol_tbl_2) as u",
"mysql_query": "select count(*) as cc, max(aggregate_int_0 > 0) as mm, min(aggregate_int_0 > 0) as mn, sum(aggregate_int_0 > 0) as su, avg(aggregate_int_0 > 0) as av from (select aggregate_int_0, groupby_int_0 from alice.tbl_0 union all select aggregate_int_0, groupby_int_0 from bob.tbl_1 union all select aggregate_int_0, groupby_int_0 from carol.tbl_2) as u"
},
{
"name": "join in",
"query": "explain select (alice.compare_int_0 + bob.compare_int_0 + carol.compare_int_0) in (100, 12.3, 10) as res, alice.compare_int_0 not in (0, 10, 100) as res1 from alice_tbl_0 as alice, bob_tbl_0 as bob, carol_tbl_0 as carol where alice.join_int_0 = bob.join_int_0 and bob.join_int_0 = carol.join_int_0;",
"mysql_query": "select (alice.compare_int_0 + bob.compare_int_0 + carol.compare_int_0) in (100, 12.3, 10) as res, alice.compare_int_0 not in (0, 10, 100) as res1 from alice.tbl_0 as alice, bob.tbl_0 as bob, carol.tbl_0 as carol where alice.join_int_0 = bob.join_int_0 and bob.join_int_0 = carol.join_int_0;"
},
{
"name": "if (compare)",
"query": "explain select if(alice.compare_int_0 > bob.compare_int_0, alice.plain_int_0, bob.plain_int_0) as res1, if(bob.compare_int_0 > carol.compare_int_0, bob.plain_int_0, carol.plain_int_0) as res2 from alice_tbl_0 as alice, bob_tbl_0 as bob, carol_tbl_0 as carol where alice.join_int_0 = bob.join_int_0 and bob.join_int_0 = carol.join_int_0;",
"mysql_query": "select if(alice.compare_int_0 > bob.compare_int_0, alice.plain_int_0, bob.plain_int_0) as res1, if(bob.compare_int_0 > carol.compare_int_0, bob.plain_int_0, carol.plain_int_0) as res2 from alice.tbl_0 as alice, bob.tbl_0 as bob, carol.tbl_0 as carol where alice.join_int_0 = bob.join_int_0 and bob.join_int_0 = carol.join_int_0;"
},
{
"name": "case when after join",
"query": "explain select case when alice.compare_int_0 > bob.compare_int_0 then alice.plain_int_0 else bob.plain_int_0 end as case_when1, case when bob.compare_int_0 > carol.compare_int_0 then 1 else 0 end as case_when2 from alice_tbl_0 as alice, bob_tbl_0 as bob, carol_tbl_0 as carol where alice.join_int_0 = bob.join_int_0 and bob.join_int_0 = carol.join_int_0;",
"mysql_query": "select case when alice.compare_int_0 > bob.compare_int_0 then alice.plain_int_0 else bob.plain_int_0 end as case_when1, case when bob.compare_int_0 > carol.compare_int_0 then 1 else 0 end as case_when2 from alice.tbl_0 as alice, bob.tbl_0 as bob, carol.tbl_0 as carol where alice.join_int_0 = bob.join_int_0 and bob.join_int_0 = carol.join_int_0;"
},
{
"name": "case when(multi condition) after join",
"query": "explain select case when alice.compare_int_0 > bob.compare_int_0 then alice.plain_int_0 when carol.compare_int_0 > 100 then carol.plain_int_0 when carol.plain_int_0 then 1 else 0 end as res1 from alice_tbl_0 as alice, bob_tbl_0 as bob, carol_tbl_0 as carol where alice.join_int_0 = bob.join_int_0 and bob.join_int_0 = carol.join_int_0;",
"mysql_query": "select case when alice.compare_int_0 > bob.compare_int_0 then alice.plain_int_0 when carol.compare_int_0 > 100 then carol.plain_int_0 when carol.plain_int_0 then 1 else 0 end as res1 from alice.tbl_0 as alice, bob.tbl_0 as bob, carol.tbl_0 as carol where alice.join_int_0 = bob.join_int_0 and bob.join_int_0 = carol.join_int_0;"
},
{
"name": "test case sensitive",
"query": "explain select alice.groupby_int_0 as r1, alice.GROUPBY_int_1 as r2, bob.join_string_0 as r3, bob.JOIN_STRING_0 as r4 from alice_UPPER_table as alice, bob_UPPER_table as bob, carol_UPPER_table as carol where alice.join_string_0 = bob.JOIN_string_0 and bob.join_string_1 = carol.JOIN_string_1 and carol.COMPARE_float_0 > 0 and carol.compare_float_1 > 0;",
"mysql_query": "select alice.groupby_int_0 as r1, alice.GROUPBY_int_1 as r2, bob.join_string_0 as r3, bob.JOIN_STRING_0 as r4 from alice.UPPER_table as alice, bob.UPPER_table as bob, carol.UPPER_table as carol where alice.join_string_0 = bob.JOIN_string_0 and bob.join_string_1 = carol.JOIN_string_1 and carol.COMPARE_float_0 > 0 and carol.compare_float_1 > 0;"
}
]
}
Loading
Loading