From f36d3ec9f35b713234d326de4ce062e5e84fb2d3 Mon Sep 17 00:00:00 2001 From: Vasiliy Yashkov Date: Tue, 30 Sep 2025 10:09:27 +0300 Subject: [PATCH 1/4] Implementation of external data management --- .vscode/launch.json | 80 ++ .vscode/settings.json | 29 +- doc/sql.extensions/README.MED.md | 334 +++++++++ src/burp/OdsDetection.epp | 1 + src/burp/backup.epp | 303 +++++++- src/burp/burp.h | 59 +- src/burp/restore.epp | 689 +++++++++++++++++ src/common/ParserTokens.h | 4 + src/dsql/DdlNodes.epp | 999 +++++++++++++++++++++++-- src/dsql/DdlNodes.h | 393 +++++++++- src/dsql/ExprNodes.cpp | 3 +- src/dsql/StmtNodes.cpp | 166 +++- src/dsql/StmtNodes.h | 25 +- src/dsql/dsql.h | 11 +- src/dsql/metd.epp | 2 + src/dsql/parse-conflicts.txt | 2 +- src/dsql/parse.y | 523 ++++++++++++- src/dsql/pass1.cpp | 2 +- src/gpre/pat.cpp | 2 +- src/include/firebird/impl/blr.h | 1 + src/include/firebird/impl/consts_pub.h | 1 + src/include/firebird/impl/inf_pub.h | 13 + src/include/firebird/impl/msg/dyn.h | 3 + src/include/firebird/impl/msg/gbak.h | 20 + src/include/firebird/impl/msg/isql.h | 6 + src/include/firebird/impl/msg/jrd.h | 2 + src/include/firebird/impl/msg/sqlerr.h | 15 + src/include/gen/Firebird.pas | 26 + src/isql/FrontendParser.cpp | 6 + src/isql/FrontendParser.h | 4 + src/isql/extract.epp | 374 +++++++++ src/isql/show.epp | 340 +++++++++ src/jrd/Attachment.cpp | 8 + src/jrd/ForeignServer.cpp | 864 +++++++++++++++++++++ src/jrd/ForeignServer.h | 244 ++++++ src/jrd/Mapping.cpp | 188 ++++- src/jrd/Mapping.h | 4 + src/jrd/RecordSourceNodes.cpp | 16 + src/jrd/RecordSourceNodes.h | 3 + src/jrd/Relation.h | 11 +- src/jrd/constants.h | 28 +- src/jrd/dfw.epp | 43 +- src/jrd/drq.h | 20 + src/jrd/dyn_util.epp | 13 + src/jrd/extds/ExtDS.cpp | 27 +- src/jrd/extds/ExtDS.h | 8 +- src/jrd/extds/IscDS.cpp | 67 ++ src/jrd/extds/IscDS.h | 4 + src/jrd/fields.h | 7 + src/jrd/grant.epp | 15 + src/jrd/idx.h | 33 + src/jrd/irq.h | 7 + src/jrd/jrd.h | 2 + src/jrd/met.epp | 160 ++++ src/jrd/met_proto.h | 3 + src/jrd/names.h | 17 + src/jrd/obj.h | 10 +- src/jrd/optimizer/Optimizer.cpp | 50 +- src/jrd/optimizer/Optimizer.h | 5 + src/jrd/optimizer/Retrieval.cpp | 2 +- src/jrd/recsrc/ForeignTableScan.cpp | 634 ++++++++++++++++ src/jrd/recsrc/RecordSource.h | 53 ++ src/jrd/recsrc/SortedStream.cpp | 5 +- src/jrd/relations.h | 50 ++ src/jrd/scl.epp | 36 + src/jrd/scl_proto.h | 2 + src/jrd/tra.h | 1 + src/jrd/vio.cpp | 49 ++ 68 files changed, 6964 insertions(+), 163 deletions(-) create mode 100644 doc/sql.extensions/README.MED.md create mode 100644 src/jrd/ForeignServer.cpp create mode 100644 src/jrd/ForeignServer.h create mode 100644 src/jrd/recsrc/ForeignTableScan.cpp diff --git a/.vscode/launch.json b/.vscode/launch.json index a5da522a67d..11cff24fd15 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -21,6 +21,86 @@ "MIMode": "gdb" } }, + { + "name": "firebird - launch", + "type": "cppdbg", + "request": "launch", + "program": "${workspaceRoot}/gen/Debug/firebird/bin/firebird", + "args": [], + "stopAtEntry": false, + "cwd": "${workspaceRoot}", + "environment": [], + "externalConsole": false, + "linux": { + "MIMode": "gdb" + }, + "osx": { + "MIMode": "lldb" + }, + "windows": { + "MIMode": "gdb" + } + }, + { + "name": "gbak - launch backup", + "type": "cppdbg", + "request": "launch", + "program": "${workspaceRoot}/gen/Debug/firebird/bin/gbak", + "args": ["-b", "-v", "-user", "SYSDBA", "-password", "masterkey", "localhost:employee", "/tmp/1.fbk"], + "stopAtEntry": false, + "cwd": "${workspaceRoot}", + "environment": [], + "externalConsole": false, + "linux": { + "MIMode": "gdb" + }, + "osx": { + "MIMode": "lldb" + }, + "windows": { + "MIMode": "gdb" + } + }, + { + "name": "gbak - launch restore", + "type": "cppdbg", + "request": "launch", + "program": "${workspaceRoot}/gen/Debug/firebird/bin/gbak", + "args": ["-c", "-v", "-rep", "-user", "SYSDBA", "-password", "masterkey", "/tmp/1.fbk", "localhost:/tmp/2.fdb"], + "stopAtEntry": false, + "cwd": "${workspaceRoot}", + "environment": [], + "externalConsole": false, + "linux": { + "MIMode": "gdb" + }, + "osx": { + "MIMode": "lldb" + }, + "windows": { + "MIMode": "gdb" + } + }, + { + "name": "gpre_current - launch", + "type": "cppdbg", + "request": "launch", + "program": "${workspaceRoot}/gen/Debug/firebird/bin/gpre_current", + "args": ["-m", "-z", "-n", "-ocxx", "/home/vasiliy/dev/github/firebird/src/burp/backup.epp", "/tmp/backup.cpp"], + "stopAtEntry": false, + "cwd": "${workspaceRoot}/gen", + "environment": [], + "externalConsole": false, + "linux": { + "MIMode": "gdb" + }, + "osx": { + "MIMode": "lldb" + }, + "windows": { + "MIMode": "gdb" + } + }, { "name": "isql - attach", "type": "cppdbg", diff --git a/.vscode/settings.json b/.vscode/settings.json index acfef36e7d0..c126b6b877c 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -14,7 +14,34 @@ "files.insertFinalNewline": true, "files.associations": { - "*.epp": "cpp" + "*.epp": "cpp", + "array": "cpp", + "deque": "cpp", + "forward_list": "cpp", + "list": "cpp", + "string": "cpp", + "unordered_map": "cpp", + "unordered_set": "cpp", + "vector": "cpp", + "string_view": "cpp", + "format": "cpp", + "initializer_list": "cpp", + "span": "cpp", + "regex": "cpp", + "*.inc": "cpp", + "chrono": "cpp", + "text_encoding": "cpp", + "typeindex": "cpp", + "typeinfo": "cpp", + "charconv": "cpp", + "optional": "cpp", + "ranges": "cpp", + "ratio": "cpp", + "system_error": "cpp", + "functional": "cpp", + "tuple": "cpp", + "type_traits": "cpp", + "utility": "cpp" }, "search.exclude": { "temp/**": true, diff --git a/doc/sql.extensions/README.MED.md b/doc/sql.extensions/README.MED.md new file mode 100644 index 00000000000..4dd9ec9a5df --- /dev/null +++ b/doc/sql.extensions/README.MED.md @@ -0,0 +1,334 @@ +# Management of External Data \(FB 6.0\) + +## Concept + +Firebird 6.0 allows to managing external data \(distributed or heterogeneous queries\). Distributed queries allow managing data stored in other databases. Those databases can be located on the same or different servers and use the same or different DBMS. Distributed queries allow to integrate and process data from different sources, providing developers with the ability to work with them as a single logical unit. + +External data management is defined by ISO/IEC 9075\-9:2023\(E\) \(SQL/MED\) standard. External data management implies both read and write access to external data. Access to foreign data is implemented using 4 objects: foreign-data wrapper, foreign server, user mapping, and foreign table. + +## Syntax + +### Foreign-data wrapper + +In Firebird, the foreign-data wrapper can be implemented as a provider \(plugin\). To use a foreign-data wrapper, it should be defined in `plugins.conf`, for example: +``` +Plugin = JDBC { + Module = $(dir_plugins)/jdbc_provider + Config = JDBC_config +} + +Config = JDBC_config { + Dir = $(this)/jdbc +} +``` +To connect to Firebird databases, the Engine and Remote providers are available by default and require no additional definition in `plugins.conf`. + +### Foreign server + +A foreign server is a logical representation of a remote data source inside the DBMS. The DBMS connects to the foreign server to execute queries. The foreign server provides metadata and connection information about the remote data source. Usually, the external server stores the connection parameters such as connection string, port, database type, etc. + +#### CREATE SERVER definition + +```sql +CREATE SERVER [IF NOT EXISTS] + [{FOREIGN DATA WRAPPER | USING PLUGIN} ] [OPTIONS (