Skip to content

Commit 45a8221

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

File tree

3 files changed

+63
-4
lines changed

3 files changed

+63
-4
lines changed

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

+60-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

@@ -36,7 +39,7 @@ public static class MySQLJdbcLatestVersionTest {
3639
@BeforeClass
3740
public static void setUpContainer() {
3841
mysql.start();
39-
TestUtil.registerProcedure(db, Jdbc.class);
42+
TestUtil.registerProcedure(db, Jdbc.class, Periodic.class);
4043
}
4144

4245
@AfterClass
@@ -54,6 +57,11 @@ public void testLoadJdbc() {
5457
public void testIssue3496() {
5558
MySQLJdbcTest.testIssue3496(db, mysql);
5659
}
60+
61+
@Test
62+
public void testWithPeriodicRepeat() {
63+
MySQLJdbcTest.testPeriodicRepeat(db, mysql);
64+
}
5765
}
5866

5967
public static class MySQLJdbcFiveVersionTest {
@@ -67,7 +75,7 @@ public static class MySQLJdbcFiveVersionTest {
6775
@BeforeClass
6876
public static void setUpContainer() {
6977
mysql.start();
70-
TestUtil.registerProcedure(db, Jdbc.class);
78+
TestUtil.registerProcedure(db, Jdbc.class, Periodic.class);
7179
}
7280

7381
@AfterClass
@@ -85,8 +93,57 @@ public void testLoadJdbc() {
8593
public void testIssue3496() {
8694
MySQLJdbcTest.testIssue3496(db, mysql);
8795
}
96+
97+
@Test
98+
public void testWithPeriodicRepeat() {
99+
MySQLJdbcTest.testPeriodicRepeat(db, mysql);
100+
}
88101
}
102+
103+
104+
private static void testPeriodicRepeat(DbmsRule db, MySQLContainerExtension mysql) {
105+
String url = mysql.getJdbcUrl();
106+
107+
String sqlQuery = "insert ignore into merchandise_id (id, source) values ('112233', 'Example Data 112233')";
108+
String query = """
109+
call apoc.periodic.repeat(
110+
'000. test',
111+
'call apoc.load.jdbcUpdate(
112+
$url,
113+
$sqlQuery,
114+
[],
115+
{credentials: {user: $user, password: $password}}) YIELD row',
116+
1,
117+
{ params: $params }
118+
);
119+
""";
89120

121+
db.executeTransactionally(
122+
query,
123+
Util.map("params", Util.map(
124+
"url", url,
125+
"sqlQuery", sqlQuery,
126+
"user", mysql.getUsername(),
127+
"password", mysql.getPassword()
128+
)),
129+
Result::resultAsString
130+
);
131+
132+
testCallEventually(db, """
133+
WITH $url as url
134+
CALL apoc.load.jdbc(url, "merchandise_id", [], {credentials: {user: $user, password: $password}}) YIELD row
135+
RETURN count(*);
136+
""",
137+
Util.map(
138+
"url", url,
139+
"user", mysql.getUsername(),
140+
"password", mysql.getPassword()
141+
),
142+
(row) -> assertEquals(2L, row.get("count(*)")),
143+
3
144+
);
145+
}
146+
90147
private static void testLoadJdbc(DbmsRule db, MySQLContainerExtension mysql) {
91148
// with the config {timezone: 'UTC'} and `preserveInstants=true&connectionTimeZone=SERVER` to make the result deterministic,
92149
// since `TIMESTAMP` values are automatically converted from the session time zone to UTC for storage, and vice versa.

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 ) );

extended/src/test/resources/init_mysql.sql

+2
Original file line numberDiff line numberDiff line change
@@ -96,3 +96,5 @@ INSERT INTO `countrylanguage` VALUES ('NLD','Turkish','F',0.8);
9696
COMMIT;
9797

9898
SET AUTOCOMMIT=1;
99+
100+
CREATE TABLE merchandise_id (id varchar(255), source varchar(255) );

0 commit comments

Comments
 (0)