Company or project name
No response
Describe what's wrong
I have a local Iceberg REST Catalog and some Iceberg tables in a Seaweedfs S3-compatible bucket. The Iceberg namespaces and table names contain a mix of _, -, and ., and I believe the . is tripping up Proton.
The namespace name looks something like a__b_c__d-e-2, while the table name looks something like a.b.v1.c.d_e_f.g.
I know that . and _ are allowable characters, since I tried creating a completely new Iceberg table from Proton with names that contain both of those characters, and Proton happily created them in my local Iceberg REST Catalog.
I believe the issue may be in the generateCreateTableQuery() method: parseTableName() assumes that the table doesn't contain any .s, so if it sees a . in the name then it assumes it's the delimiter between Iceberg REST Catalog namespace and the table name. However, I have to admit I'm still not 100% sure how that then leads to the eventual error returned from Poco, so this hypothesis could well be wrong.
Does it reproduce on the most recent release?
Yes
How to reproduce
I used Proton v3.0.13, with the default config and users files at
I added this to my config.yaml file:
url_scheme_mappers:
s3:
to: http://localhost:8333/{bucket}
though no idea if this was actually correct or if it actually belongs in the config.yaml file.
My default user looks like:
password: ''
networks:
- ip: '::/0'
profile: default
quota: default
allow_databases:
- database: default
- database: '*'
default_database: default
I started the Proton CLI client as the default user, then ran:
CREATE DATABASE `a__b_c__d-e-2`
SETTINGS
type = 'iceberg',
catalog_uri = 'http://localhost:8050/catalog', -- This is my Iceberg REST Catalog endpoint
catalog_type = 'rest',
warehouse = 'localbridge',
storage_endpoint = 's3://localbridge-bucket/',
rest_catalog_sigv4_enabled = false,
use_environment_credentials = false;
This succeeded. See below for the problematic SQL commands that I ran after this.
The Iceberg behaviour is quite a lot of work to reproduce - I believe you have to first have an Iceberg REST Catalog running locally (I used Lakekeeper) and an S3-compatible bucket (I used Seaweedfs), before you can successfully CREATE DATABASE in Proton. So it may be worth trying to reproduce with unit tests first. If that's not workable then I'm happy to share my full set-up.
Expected behavior
The below SQL commands should work, and shouldn't throw an exception.
Error message and/or stacktrace
When running:
SHOW TABLES from `a__b_c__d-e-2`;
I get:
SHOW STREAMS FROM `a__b_c__d-e-2`
Query id: 7e8e04b7-768a-44ef-8aa7-fe952ea0e756
0 rows in set. Elapsed: 0.050 sec.
Received exception from server (version 3.0.13):
Code: 1000. DB::Exception: Received from localhost:8463. DB::Exception: Bad URI syntax: URI contains invalid characters. (POCO_EXCEPTION)
I see this exception in the server logs:
2026.01.13 15:51:43.456059 [ 1637680 ] {a613f40d-7e38-4df4-94f3-69feadede44e} <Error> TCPHandler: Code: 1000. DB::Exception: Bad URI syntax: URI contains invalid characters. (POCO_EXCEPTION), Stack trace (when copying this message, always include the lines below):
0. Poco::URI::parse(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&) @ 0x000000001cf12053 in /home/kelvin/code/core3/plz-out/bin/vault/bridge/experimental/timeplus_proton/proton-v3.0.13-Linux-x86_64
1. Poco::URI::URI(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, bool) @ 0x000000001cf11da7 in /home/kelvin/code/core3/plz-out/bin/vault/bridge/experimental/timeplus_proton/proton-v3.0.13-Linux-x86_64
2. Apache::Iceberg::RestCatalog::buildURI(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&) const @ 0x00000000147fb23d in /home/kelvin/code/core3/plz-out/bin/vault/bridge/experimental/timeplus_proton/proton-v3.0.13-Linux-x86_64
3. Apache::Iceberg::RestCatalog::createReadBuffer(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::vector<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>>, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>>>> const&, std::__1::vector<DB::HTTPHeaderEntry, std::__1::allocator<DB::HTTPHeaderEntry>> const&) const @ 0x00000000147f9929 in /home/kelvin/code/core3/plz-out/bin/vault/bridge/experimental/timeplus_proton/proton-v3.0.13-Linux-x86_64
4. Apache::Iceberg::RestCatalog::getTableMetadataImpl(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, Apache::Iceberg::TableMetadata&) const @ 0x0000000014806cc5 in /home/kelvin/code/core3/plz-out/bin/vault/bridge/experimental/timeplus_proton/proton-v3.0.13-Linux-x86_64
5. Apache::Iceberg::RestCatalog::getTableMetadata(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, Apache::Iceberg::TableMetadata&) const @ 0x0000000014807bc9 in /home/kelvin/code/core3/plz-out/bin/vault/bridge/experimental/timeplus_proton/proton-v3.0.13-Linux-x86_64
6. DB::DatabaseApacheIceberg::generateCreateTableQuery(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::shared_ptr<DB::IStorage> const&, bool) const @ 0x000000001330dbcc in /home/kelvin/code/core3/plz-out/bin/vault/bridge/experimental/timeplus_proton/proton-v3.0.13-Linux-x86_64
7. DB::DatabaseApacheIceberg::tryGetTable(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::shared_ptr<DB::Context const>) const @ 0x00000000133087c5 in /home/kelvin/code/core3/plz-out/bin/vault/bridge/experimental/timeplus_proton/proton-v3.0.13-Linux-x86_64
8. DB::DatabaseApacheIceberg::getTablesIterator(std::__1::shared_ptr<DB::Context const>, std::__1::function<bool (std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&)> const&) const @ 0x000000001330b317 in /home/kelvin/code/core3/plz-out/bin/vault/bridge/experimental/timeplus_proton/proton-v3.0.13-Linux-x86_64
9. DB::ReadFromSystemTables::initializePipeline(DB::QueryPipelineBuilder&, DB::BuildQueryPipelineSettings const&) @ 0x0000000012b5ddb8 in /home/kelvin/code/core3/plz-out/bin/vault/bridge/experimental/timeplus_proton/proton-v3.0.13-Linux-x86_64
10. DB::ISourceStep::updatePipeline(std::__1::vector<std::__1::unique_ptr<DB::QueryPipelineBuilder, std::__1::default_delete<DB::QueryPipelineBuilder>>, std::__1::allocator<std::__1::unique_ptr<DB::QueryPipelineBuilder, std::__1::default_delete<DB::QueryPipelineBuilder>>>>, DB::BuildQueryPipelineSettings const&) @ 0x000000001750a0d3 in /home/kelvin/code/core3/plz-out/bin/vault/bridge/experimental/timeplus_proton/proton-v3.0.13-Linux-x86_64
11. DB::QueryPlan::buildQueryPipeline(DB::QueryPlanOptimizationSettings const&, DB::BuildQueryPipelineSettings const&, std::__1::shared_ptr<DB::Context const>) @ 0x0000000017529785 in /home/kelvin/code/core3/plz-out/bin/vault/bridge/experimental/timeplus_proton/proton-v3.0.13-Linux-x86_64
12. DB::InterpreterSelectWithUnionQuery::execute() @ 0x0000000013acf00f in /home/kelvin/code/core3/plz-out/bin/vault/bridge/experimental/timeplus_proton/proton-v3.0.13-Linux-x86_64
13. DB::executeQueryImpl(char const*, char const*, std::__1::shared_ptr<DB::Context>, bool, DB::QueryProcessingStage::Enum, DB::ReadBuffer*) @ 0x0000000013e6857b in /home/kelvin/code/core3/plz-out/bin/vault/bridge/experimental/timeplus_proton/proton-v3.0.13-Linux-x86_64
14. DB::executeQuery(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::shared_ptr<DB::Context>, bool, DB::QueryProcessingStage::Enum) @ 0x0000000013e63ad3 in /home/kelvin/code/core3/plz-out/bin/vault/bridge/experimental/timeplus_proton/proton-v3.0.13-Linux-x86_64
15. DB::InterpreterShowTablesQuery::execute() @ 0x0000000013e7c761 in /home/kelvin/code/core3/plz-out/bin/vault/bridge/experimental/timeplus_proton/proton-v3.0.13-Linux-x86_64
16. DB::executeQueryImpl(char const*, char const*, std::__1::shared_ptr<DB::Context>, bool, DB::QueryProcessingStage::Enum, DB::ReadBuffer*) @ 0x0000000013e6857b in /home/kelvin/code/core3/plz-out/bin/vault/bridge/experimental/timeplus_proton/proton-v3.0.13-Linux-x86_64
17. DB::executeQuery(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::shared_ptr<DB::Context>, bool, DB::QueryProcessingStage::Enum) @ 0x0000000013e63ad3 in /home/kelvin/code/core3/plz-out/bin/vault/bridge/experimental/timeplus_proton/proton-v3.0.13-Linux-x86_64
18. DB::TCPHandler::runImpl() @ 0x0000000014766e7c in /home/kelvin/code/core3/plz-out/bin/vault/bridge/experimental/timeplus_proton/proton-v3.0.13-Linux-x86_64
19. DB::TCPHandler::run() @ 0x000000001477bef9 in /home/kelvin/code/core3/plz-out/bin/vault/bridge/experimental/timeplus_proton/proton-v3.0.13-Linux-x86_64
20. Poco::Net::TCPServerConnection::start() @ 0x000000001c48e227 in /home/kelvin/code/core3/plz-out/bin/vault/bridge/experimental/timeplus_proton/proton-v3.0.13-Linux-x86_64
21. Poco::Net::TCPServerDispatcher::run() @ 0x000000001c48e731 in /home/kelvin/code/core3/plz-out/bin/vault/bridge/experimental/timeplus_proton/proton-v3.0.13-Linux-x86_64
22. Poco::PooledThread::run() @ 0x000000001cf0d827 in /home/kelvin/code/core3/plz-out/bin/vault/bridge/experimental/timeplus_proton/proton-v3.0.13-Linux-x86_64
23. Poco::ThreadImpl::runnableEntry(void*) @ 0x000000001cf0b2bd in /home/kelvin/code/core3/plz-out/bin/vault/bridge/experimental/timeplus_proton/proton-v3.0.13-Linux-x86_64
24. ? @ 0x00007fb2d7645ac3 in ?
25. ? @ 0x00007fb2d76d78c0 in ?
When running:
SELECT * FROM `a__b_c__d-e-2`.`a.b.v1.c.d_e_f.g` LIMIT 10;
I get the same error:
SELECT
*
FROM
`a__b_c__d-e-2`.`a.b.v1.c.d_e_f.g`
LIMIT 10
Query id: 19dfc9a6-8f1f-4bc9-b2c9-4744095c52a2
0 rows in set. Elapsed: 0.176 sec.
Received exception from server (version 3.0.13):
Code: 1000. DB::Exception: Received from localhost:8463. DB::Exception: Bad URI syntax: URI contains invalid characters. (POCO_EXCEPTION)
with this exception in the server logs:
2026.01.13 15:52:18.210095 [ 1637680 ] {19dfc9a6-8f1f-4bc9-b2c9-4744095c52a2} <Error> TCPHandler: Code: 1000. DB::Exception: Bad URI syntax: URI contains invalid characters. (POCO_EXCEPTION), Stack trace (when copying this message, always include the lines below):
0. Poco::URI::parse(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&) @ 0x000000001cf12053 in /home/kelvin/code/core3/plz-out/bin/vault/bridge/experimental/timeplus_proton/proton-v3.0.13-Linux-x86_64
1. Poco::URI::URI(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, bool) @ 0x000000001cf11da7 in /home/kelvin/code/core3/plz-out/bin/vault/bridge/experimental/timeplus_proton/proton-v3.0.13-Linux-x86_64
2. Apache::Iceberg::RestCatalog::buildURI(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&) const @ 0x00000000147fb23d in /home/kelvin/code/core3/plz-out/bin/vault/bridge/experimental/timeplus_proton/proton-v3.0.13-Linux-x86_64
3. Apache::Iceberg::RestCatalog::createReadBuffer(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::vector<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>>, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>>>> const&, std::__1::vector<DB::HTTPHeaderEntry, std::__1::allocator<DB::HTTPHeaderEntry>> const&) const @ 0x00000000147f9929 in /home/kelvin/code/core3/plz-out/bin/vault/bridge/experimental/timeplus_proton/proton-v3.0.13-Linux-x86_64
4. Apache::Iceberg::RestCatalog::getTableMetadataImpl(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, Apache::Iceberg::TableMetadata&) const @ 0x0000000014806cc5 in /home/kelvin/code/core3/plz-out/bin/vault/bridge/experimental/timeplus_proton/proton-v3.0.13-Linux-x86_64
5. Apache::Iceberg::RestCatalog::getTableMetadata(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, Apache::Iceberg::TableMetadata&) const @ 0x0000000014807bc9 in /home/kelvin/code/core3/plz-out/bin/vault/bridge/experimental/timeplus_proton/proton-v3.0.13-Linux-x86_64
6. DB::DatabaseApacheIceberg::generateCreateTableQuery(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::shared_ptr<DB::IStorage> const&, bool) const @ 0x000000001330dbcc in /home/kelvin/code/core3/plz-out/bin/vault/bridge/experimental/timeplus_proton/proton-v3.0.13-Linux-x86_64
7. DB::DatabaseApacheIceberg::tryGetTable(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::shared_ptr<DB::Context const>) const @ 0x00000000133087c5 in /home/kelvin/code/core3/plz-out/bin/vault/bridge/experimental/timeplus_proton/proton-v3.0.13-Linux-x86_64
8. DB::DatabaseCatalog::getTableImpl(DB::StorageID const&, std::__1::shared_ptr<DB::Context const>, std::__1::optional<DB::Exception>*) const @ 0x00000000137b4aea in /home/kelvin/code/core3/plz-out/bin/vault/bridge/experimental/timeplus_proton/proton-v3.0.13-Linux-x86_64
9. DB::DatabaseCatalog::getTable(DB::StorageID const&, std::__1::shared_ptr<DB::Context const>) const @ 0x00000000137ba38a in /home/kelvin/code/core3/plz-out/bin/vault/bridge/experimental/timeplus_proton/proton-v3.0.13-Linux-x86_64
10. DB::JoinedTables::getLeftTableStorage() @ 0x0000000013aed414 in /home/kelvin/code/core3/plz-out/bin/vault/bridge/experimental/timeplus_proton/proton-v3.0.13-Linux-x86_64
11. DB::InterpreterSelectQuery::resolveTablesAndRewriteJoin(DB::JoinedTables&) @ 0x0000000013ab1752 in /home/kelvin/code/core3/plz-out/bin/vault/bridge/experimental/timeplus_proton/proton-v3.0.13-Linux-x86_64
12. DB::InterpreterSelectQuery::InterpreterSelectQuery(std::__1::shared_ptr<DB::IAST> const&, std::__1::shared_ptr<DB::Context> const&, std::__1::optional<DB::Pipe>, std::__1::shared_ptr<DB::IStorage> const&, DB::SelectQueryOptions const&, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>>> const&, std::__1::shared_ptr<DB::StorageInMemoryMetadata const> const&, std::__1::shared_ptr<DB::PreparedSets>) @ 0x0000000013a6a97d in /home/kelvin/code/core3/plz-out/bin/vault/bridge/experimental/timeplus_proton/proton-v3.0.13-Linux-x86_64
13. DB::InterpreterSelectWithUnionQuery::buildCurrentChildInterpreter(std::__1::shared_ptr<DB::IAST> const&, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>>> const&) @ 0x0000000013aca101 in /home/kelvin/code/core3/plz-out/bin/vault/bridge/experimental/timeplus_proton/proton-v3.0.13-Linux-x86_64
14. DB::InterpreterSelectWithUnionQuery::InterpreterSelectWithUnionQuery(std::__1::shared_ptr<DB::IAST> const&, std::__1::shared_ptr<DB::Context> const&, DB::SelectQueryOptions const&, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>>> const&) @ 0x0000000013ac8de7 in /home/kelvin/code/core3/plz-out/bin/vault/bridge/experimental/timeplus_proton/proton-v3.0.13-Linux-x86_64
15. DB::InterpreterFactory::get(std::__1::shared_ptr<DB::IAST>&, std::__1::shared_ptr<DB::Context>, DB::SelectQueryOptions const&) @ 0x0000000013e76e35 in /home/kelvin/code/core3/plz-out/bin/vault/bridge/experimental/timeplus_proton/proton-v3.0.13-Linux-x86_64
16. DB::executeQueryImpl(char const*, char const*, std::__1::shared_ptr<DB::Context>, bool, DB::QueryProcessingStage::Enum, DB::ReadBuffer*) @ 0x0000000013e67d75 in /home/kelvin/code/core3/plz-out/bin/vault/bridge/experimental/timeplus_proton/proton-v3.0.13-Linux-x86_64
17. DB::executeQuery(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::shared_ptr<DB::Context>, bool, DB::QueryProcessingStage::Enum) @ 0x0000000013e63ad3 in /home/kelvin/code/core3/plz-out/bin/vault/bridge/experimental/timeplus_proton/proton-v3.0.13-Linux-x86_64
18. DB::TCPHandler::runImpl() @ 0x0000000014766e7c in /home/kelvin/code/core3/plz-out/bin/vault/bridge/experimental/timeplus_proton/proton-v3.0.13-Linux-x86_64
19. DB::TCPHandler::run() @ 0x000000001477bef9 in /home/kelvin/code/core3/plz-out/bin/vault/bridge/experimental/timeplus_proton/proton-v3.0.13-Linux-x86_64
20. Poco::Net::TCPServerConnection::start() @ 0x000000001c48e227 in /home/kelvin/code/core3/plz-out/bin/vault/bridge/experimental/timeplus_proton/proton-v3.0.13-Linux-x86_64
21. Poco::Net::TCPServerDispatcher::run() @ 0x000000001c48e731 in /home/kelvin/code/core3/plz-out/bin/vault/bridge/experimental/timeplus_proton/proton-v3.0.13-Linux-x86_64
22. Poco::PooledThread::run() @ 0x000000001cf0d827 in /home/kelvin/code/core3/plz-out/bin/vault/bridge/experimental/timeplus_proton/proton-v3.0.13-Linux-x86_64
23. Poco::ThreadImpl::runnableEntry(void*) @ 0x000000001cf0b2bd in /home/kelvin/code/core3/plz-out/bin/vault/bridge/experimental/timeplus_proton/proton-v3.0.13-Linux-x86_64
24. ? @ 0x00007fb2d7645ac3 in ?
25. ? @ 0x00007fb2d76d78c0 in ?
Additional context
No response
Company or project name
No response
Describe what's wrong
I have a local Iceberg REST Catalog and some Iceberg tables in a Seaweedfs S3-compatible bucket. The Iceberg namespaces and table names contain a mix of
_,-, and., and I believe the.is tripping up Proton.The namespace name looks something like
a__b_c__d-e-2, while the table name looks something likea.b.v1.c.d_e_f.g.I know that
.and_are allowable characters, since I tried creating a completely new Iceberg table from Proton with names that contain both of those characters, and Proton happily created them in my local Iceberg REST Catalog.I believe the issue may be in the
generateCreateTableQuery()method:parseTableName()assumes that the table doesn't contain any.s, so if it sees a.in the name then it assumes it's the delimiter between Iceberg REST Catalog namespace and the table name. However, I have to admit I'm still not 100% sure how that then leads to the eventual error returned from Poco, so this hypothesis could well be wrong.Does it reproduce on the most recent release?
Yes
How to reproduce
I used Proton v3.0.13, with the default config and users files at
I added this to my
config.yamlfile:though no idea if this was actually correct or if it actually belongs in the
config.yamlfile.My
defaultuser looks like:I started the Proton CLI client as the
defaultuser, then ran:This succeeded. See below for the problematic SQL commands that I ran after this.
The Iceberg behaviour is quite a lot of work to reproduce - I believe you have to first have an Iceberg REST Catalog running locally (I used Lakekeeper) and an S3-compatible bucket (I used Seaweedfs), before you can successfully
CREATE DATABASEin Proton. So it may be worth trying to reproduce with unit tests first. If that's not workable then I'm happy to share my full set-up.Expected behavior
The below SQL commands should work, and shouldn't throw an exception.
Error message and/or stacktrace
When running:
I get:
I see this exception in the server logs:
When running:
I get the same error:
with this exception in the server logs:
Additional context
No response