Skip to content

Commit ba834c0

Browse files
committed
Fixes #4136: apoc.load.jdbcUpdate doesn't work in apoc.periodic.repeat procedure
1 parent c49fe8a commit ba834c0

File tree

3 files changed

+54
-4
lines changed

3 files changed

+54
-4
lines changed

extended-it/src/test/java/apoc/load/MySQLJdbcTest.java

+51-3
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
package apoc.load;
22

3-
import apoc.util.s3.MySQLContainerExtension;
3+
import apoc.periodic.Periodic;
44
import apoc.util.TestUtil;
55
import apoc.util.Util;
6+
import apoc.util.s3.MySQLContainerExtension;
67
import org.junit.AfterClass;
78
import org.junit.BeforeClass;
89
import org.junit.ClassRule;
910
import org.junit.Test;
1011
import org.junit.experimental.runners.Enclosed;
1112
import org.junit.runner.RunWith;
13+
import org.neo4j.graphdb.Result;
1214
import org.neo4j.test.rule.DbmsRule;
1315
import org.neo4j.test.rule.ImpermanentDbmsRule;
1416

@@ -19,6 +21,7 @@
1921
import java.util.Map;
2022

2123
import static apoc.util.TestUtil.testCall;
24+
import static apoc.util.TestUtil.testCallEventually;
2225
import static org.junit.Assert.assertEquals;
2326
import static org.junit.Assert.assertTrue;
2427

@@ -28,15 +31,16 @@ public class MySQLJdbcTest extends AbstractJdbcTest {
2831
public static class MySQLJdbcLatestVersionTest {
2932

3033
@ClassRule
31-
public static MySQLContainerExtension mysql = new MySQLContainerExtension("mysql:8.0.31");
34+
public static MySQLContainerExtension mysql = new MySQLContainerExtension("mysql:8.0.31")
35+
.withInitScript("init_mysql_script.sql");
3236

3337
@ClassRule
3438
public static DbmsRule db = new ImpermanentDbmsRule();
3539

3640
@BeforeClass
3741
public static void setUpContainer() {
3842
mysql.start();
39-
TestUtil.registerProcedure(db, Jdbc.class);
43+
TestUtil.registerProcedure(db, Jdbc.class, Periodic.class);
4044
}
4145

4246
@AfterClass
@@ -54,6 +58,50 @@ public void testLoadJdbc() {
5458
public void testIssue3496() {
5559
MySQLJdbcTest.testIssue3496(db, mysql);
5660
}
61+
62+
@Test
63+
public void testWithPeriodicRepeat() {
64+
String url = mysql.getJdbcUrl();
65+
66+
String sqlQuery = "insert ignore into merchandise_id (id, source) values ('112233', 'Example Data 112233')";
67+
String query = """
68+
call apoc.periodic.repeat(
69+
'000. test',
70+
'call apoc.load.jdbcUpdate(
71+
$url,
72+
$sqlQuery,
73+
[],
74+
{credentials: {user: $user, password: $password}}) YIELD row',
75+
1,
76+
{ params: $params }
77+
);
78+
""";
79+
80+
db.executeTransactionally(
81+
query,
82+
Util.map("params", Util.map(
83+
"url", url,
84+
"sqlQuery", sqlQuery,
85+
"user", mysql.getUsername(),
86+
"password", mysql.getPassword()
87+
)),
88+
Result::resultAsString
89+
);
90+
91+
testCallEventually(db, """
92+
WITH $url as url
93+
CALL apoc.load.jdbc(url, "merchandise_id", [], {credentials: {user: $user, password: $password}}) YIELD row
94+
RETURN count(*);
95+
""",
96+
Util.map(
97+
"url", url,
98+
"user", mysql.getUsername(),
99+
"password", mysql.getPassword()
100+
),
101+
(row) -> assertEquals(2L, row.get("count(*)")),
102+
3
103+
);
104+
}
57105
}
58106

59107
public static class MySQLJdbcFiveVersionTest {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
USE test;
2+
CREATE TABLE merchandise_id (id varchar(255), source varchar(255) );

extended/src/main/java/apoc/load/Jdbc.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ private Stream<RowResult> executeQuery(String urlOrKey, String tableOrSelect, Ma
103103
}
104104
}
105105

106-
@Procedure(mode = Mode.DBMS)
106+
@Procedure(mode = Mode.READ)
107107
@Description("apoc.load.jdbcUpdate('key or url','statement',[params],config) YIELD row - update relational database, from a SQL statement with optional parameters")
108108
public Stream<RowResult> jdbcUpdate(@Name("jdbc") String urlOrKey, @Name("query") String query, @Name(value = "params", defaultValue = "[]") List<Object> params, @Name(value = "config",defaultValue = "{}") Map<String, Object> config) {
109109
log.info( String.format( "Executing SQL update: %s", query ) );

0 commit comments

Comments
 (0)