-
Bug
-
Resolution: Done
-
Major
-
2.4.1.Final
-
None
-
False
-
-
False
-
Moderate
Database name is "Database$Demo". When creating a connector it fails to validate due to special character $. I have tried "[Database$Demo]", "Database\$Demo", "Database
$Demo" and "Databas\\\$Demo", neither work.
Bug report
For bug reports, provide this information, please:
What Debezium connector do you use and what version?
debezium-connector-sqlserver/2.4.1.Final/debezium-connector-sqlserver-2.4.1.Final-plugin.tar.gz
What is the connector configuration?
{ "connector.class": "io.debezium.connector.sqlserver.SqlServerConnector", "database.history.kafka.bootstrap.servers": "x", "database.history.kafka.topic": "x", "database.hostname": "x", "database.server.name": "x", "database.names": "Database$Demo", "database.password": "x", "database.port": "x", "database.user": "x", "decimal.handling.mode": "double", "errors.log.enable": "true", "errors.log.include.messages": "true", "errors.retry.delay.max.ms": "30000", "errors.retry.timeout": "600000", "errors.tolerance": "all", "incremental.snapshot.chunk.size": "32768", "key.converter.schemas.enable": "false", "max.batch.size": "32768", "max.queue.size": "65536", "name": "x", "provide.transaction.metadata": "true", "schema.history.internal.kafka.bootstrap.servers": "x", "schema.history.internal.kafka.topic": "schema_changes", "schema.include.list": "x", "signal.data.collection": "x", "snapshot.fetch.size": "8000", "snapshot.isolation.mode": "read_committed", "snapshot.mode": "schema_only", "tasks.max": "1", "time.precision.mode": "connect", "topic.creation.default.cleanup.policy": "delete", "topic.creation.default.compression.type": "lz4", "topic.creation.default.partitions": "10", "topic.creation.default.replication.factor": "1", "topic.prefix": "x", "transforms": "Reroute", "transforms.Reroute.topic.regex": "x\\.([^.]+)\\.([^.]+)\\.([^.]+)", "transforms.Reroute.topic.replacement": "x.$2", "transforms.Reroute.type": "io.debezium.transforms.ByLogicalTableRouter", "value.converter.schemas.enable": "false" }What is the captured database version and mode of deployment?
(E.g. on-premises, with a specific cloud provider, etc.)
Microsoft SQL Server 2022 (RTM-CU16) (KB5048033) - 16.0.4165.4 (X64)
Nov 6 2024 19:24:49
Copyright (C) 2022 Microsoft Corporation
Standard Edition (64-bit) on Windows Server 2022 Datacenter 10.0 <X64> (Build 20348: ) (Hypervisor)
What behavior do you expect?
Connector is created
What behavior do you see?
{ "error_code": 400, "message": "Connector configuration is invalid and contains the following 1 error(s):\nUnable to connect. Check this and other connection properties. Error: Illegal group reference\nYou can also find the above list of errors at the endpoint `/connector-plugins/\{connectorType}/config/validate`"
}
Do you see the same behaviour using the latest released Debezium version?
(Ideally, also verify with latest Alpha/Beta/CR version)
Have not tried latest version yet.
Do you have the connector logs, ideally from start till finish?
(You might be asked later to provide DEBUG/TRACE level log)
kafka-connect-5d9df5bb96-cgd25 kafka-connect 2025-02-04 12:25:08,805 ERROR Failed testing connection for {connector.class=io.debezium.connector.sqlserver.SqlServerConnector, errors.log.include.messages=true, max.queue.size=65536, topic.creation.default.partitions=10, incremental.snapshot.chunk.size=32768, tasks.max=1, database.history.kafka.topic=x.database_changes, transforms=Reroute, schema.include.list=dbo, provide.transaction.metadata=true, topic.prefix=x, transforms.Reroute.topic.replacement=x.$2, decimal.handling.mode=double, schema.history.internal.kafka.topic=x.schema_changes, signal.data.collection=x.dbo.debezium_signals, topic.creation.default.replication.factor=1, errors.log.enable=true, snapshot.fetch.size=8000, errors.retry.timeout=600000, database.user=x, topic.creation.default.compression.type=lz4, transforms.Reroute.type=io.debezium.transforms.ByLogicalTableRouter, database.names=x$Demo, topic.creation.default.cleanup.policy=delete, database.history.kafka.bootstrap.servers=x, time.precision.mode=connect, database.server.name=x, errors.retry.delay.max.ms=30000, schema.history.internal.kafka.bootstrap.servers=x, snapshot.isolation.mode=read_committed, transforms.Reroute.topic.regex=x\.([^.])\.([^.])\.([^.]+), database.port=x, key.converter.schemas.enable=false, database.hostname=x, database.password=x, name=x, value.converter.schemas.enable=false, errors.tolerance=all, max.batch.size=32768, snapshot.mode=schema_only} with user '[database.user,null,[],[],true]' (io.debezium.connector.sqlserver.SqlServerConnector) [pool-12-thread-18]
kafka-connect-5d9df5bb96-cgd25 kafka-connect java.lang.IllegalArgumentException: Illegal group reference
kafka-connect-5d9df5bb96-cgd25 kafka-connect at java.base/java.util.regex.Matcher.appendExpandedReplacement(Matcher.java:1067)
kafka-connect-5d9df5bb96-cgd25 kafka-connect at java.base/java.util.regex.Matcher.appendReplacement(Matcher.java:997)
kafka-connect-5d9df5bb96-cgd25 kafka-connect at java.base/java.util.regex.Matcher.replaceAll(Matcher.java:1181)
kafka-connect-5d9df5bb96-cgd25 kafka-connect at java.base/java.lang.String.replaceAll(String.java:2940)
kafka-connect-5d9df5bb96-cgd25 kafka-connect at io.debezium.jdbc.JdbcConnection.findAndReplace(JdbcConnection.java:312)
kafka-connect-5d9df5bb96-cgd25 kafka-connect at io.debezium.jdbc.JdbcConnection.findAndReplace(JdbcConnection.java:286)
kafka-connect-5d9df5bb96-cgd25 kafka-connect at io.debezium.jdbc.JdbcConnection.lambda$patternBasedFactory$1(JdbcConnection.java:228)
kafka-connect-5d9df5bb96-cgd25 kafka-connect at io.debezium.jdbc.JdbcConnection$ConnectionFactoryDecorator.connect(JdbcConnection.java:127)
kafka-connect-5d9df5bb96-cgd25 kafka-connect at io.debezium.jdbc.JdbcConnection.connection(JdbcConnection.java:873)
kafka-connect-5d9df5bb96-cgd25 kafka-connect at io.debezium.connector.sqlserver.SqlServerConnection.connection(SqlServerConnection.java:241)
kafka-connect-5d9df5bb96-cgd25 kafka-connect at io.debezium.jdbc.JdbcConnection.connection(JdbcConnection.java:868)
kafka-connect-5d9df5bb96-cgd25 kafka-connect at io.debezium.jdbc.JdbcConnection.execute(JdbcConnection.java:430)
kafka-connect-5d9df5bb96-cgd25 kafka-connect at io.debezium.jdbc.JdbcConnection.execute(JdbcConnection.java:409)
kafka-connect-5d9df5bb96-cgd25 kafka-connect at io.debezium.connector.sqlserver.SqlServerConnector.validateConnection(SqlServerConnector.java:122)
kafka-connect-5d9df5bb96-cgd25 kafka-connect at io.debezium.connector.common.RelationalBaseSourceConnector.validate(RelationalBaseSourceConnector.java:55)
kafka-connect-5d9df5bb96-cgd25 kafka-connect at org.apache.kafka.connect.runtime.AbstractHerder.validateConnectorConfig(AbstractHerder.java:491)
kafka-connect-5d9df5bb96-cgd25 kafka-connect at org.apache.kafka.connect.runtime.AbstractHerder.lambda$validateConnectorConfig$2(AbstractHerder.java:372)
kafka-connect-5d9df5bb96-cgd25 kafka-connect at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
kafka-connect-5d9df5bb96-cgd25 kafka-connect at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
kafka-connect-5d9df5bb96-cgd25 kafka-connect at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
kafka-connect-5d9df5bb96-cgd25 kafka-connect at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
kafka-connect-5d9df5bb96-cgd25 kafka-connect at java.base/java.lang.Thread.run(Thread.java:833)
kafka-connect-5d9df5bb96-cgd25 kafka-connect 2025-02-04 12:25:08,805 INFO AbstractConfig values:
kafka-connect-5d9df5bb96-cgd25 kafka-connect (org.apache.kafka.common.config.AbstractConfig) [pool-12-thread-18]
How to reproduce the issue using our tutorial deployment?
Post a connector with "database.names": "Database$Demo"
Chris Cranford [ 1:50 PM |https://debezium.zulipchat.com/#narrow/channel/348252-community-sqlserver/topic/Special.20characters.20in.20database.20name/near/497657625]
@Vojtech Juranek I wonder if this:
{{ if (value != null) {// And replace the variable ...url = url.replaceAll("\\$
would work if we changed it to:
{{ if (value != null) {// And replace the variable ...url = url.replaceAll("\\$
{" + name + "\}
", Pattern.quote(value));}}}