Skip to content

Commit a23f2c7

Browse files
committed
Feature #8405 - Add procedure RDB$SQL.PARSE_UNQUALIFIED_NAMES.
1 parent 11d09e1 commit a23f2c7

File tree

3 files changed

+113
-7
lines changed

3 files changed

+113
-7
lines changed

doc/sql.extensions/README.sql_package.md

+18-2
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,12 @@ Output parameters:
2424
- `KEY_LENGTH` type `INTEGER` - key length for the record source
2525
- `ACCESS_PATH` type `RDB$DESCRIPTION NOT NULL` - friendly plan description
2626

27-
```
27+
```sql
2828
select *
2929
from rdb$sql.explain('select * from employee where emp_no = ?');
3030
```
3131

32-
```
32+
```sql
3333
select *
3434
from rdb$sql.explain(q'{
3535
select *
@@ -42,5 +42,21 @@ select *
4242
}');
4343
```
4444

45+
## Procedure `PARSE_UNQUALIFIED_NAMES`
46+
47+
`RDB$SQL.PARSE_UNQUALIFIED_NAMES` is a selectable procedure that parses a list of unqualified SQL names and returns
48+
one row for each name. The input must follow parse rules for names and the output of unquoted names are uppercased.
49+
50+
```sql
51+
select *
52+
from rdb$sql.parse_unqualified_names('schema1, schema2, "schema3", "schema 4", "schema ""5"""');
53+
54+
-- SCHEMA1
55+
-- SCHEMA2
56+
-- schema3
57+
-- "schema 4"
58+
-- "schema "5"
59+
```
60+
4561
# Authors
4662
- Adriano dos Santos Fernandes

src/jrd/sys-packages/SqlPackage.cpp

+51-3
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,6 @@ IExternalResultSet* SqlPackage::explainProcedure(ThrowStatusExceptionWrapper* st
4242
}
4343

4444

45-
//--------------------------------------
46-
47-
4845
SqlPackage::ExplainResultSet::ExplainResultSet(ThrowStatusExceptionWrapper* status,
4946
IExternalContext* context, const ExplainInput::Type* in, ExplainOutput::Type* aOut)
5047
: out(aOut)
@@ -161,6 +158,42 @@ FB_BOOLEAN SqlPackage::ExplainResultSet::fetch(ThrowStatusExceptionWrapper* stat
161158
//--------------------------------------
162159

163160

161+
IExternalResultSet* SqlPackage::parseUnqualifiedNamesProcedure(ThrowStatusExceptionWrapper* status,
162+
IExternalContext* context, const ParseUnqualifiedNamesInput::Type* in, ParseUnqualifiedNamesOutput::Type* out)
163+
{
164+
return FB_NEW ParseUnqualifiedNamesResultSet(status, context, in, out);
165+
}
166+
167+
168+
SqlPackage::ParseUnqualifiedNamesResultSet::ParseUnqualifiedNamesResultSet(ThrowStatusExceptionWrapper* status,
169+
IExternalContext* context, const ParseUnqualifiedNamesInput::Type* in, ParseUnqualifiedNamesOutput::Type* aOut)
170+
: out(aOut)
171+
{
172+
if (!in->namesNull)
173+
{
174+
const string namesStr(in->names.str, in->names.length);
175+
MetaString::parseList(namesStr, resultEntries);
176+
}
177+
178+
resultIterator = resultEntries.begin();
179+
}
180+
181+
FB_BOOLEAN SqlPackage::ParseUnqualifiedNamesResultSet::fetch(ThrowStatusExceptionWrapper* status)
182+
{
183+
if (resultIterator == resultEntries.end())
184+
return false;
185+
186+
out->name.set(resultIterator->c_str(), resultIterator->length());
187+
out->nameNull = FB_FALSE;
188+
++resultIterator;
189+
190+
return true;
191+
}
192+
193+
194+
//--------------------------------------
195+
196+
164197
SqlPackage::SqlPackage(MemoryPool& pool)
165198
: SystemPackage(
166199
pool,
@@ -193,6 +226,21 @@ SqlPackage::SqlPackage(MemoryPool& pool)
193226
{"ACCESS_PATH", fld_description, false}
194227
}
195228
),
229+
SystemProcedure(
230+
pool,
231+
"PARSE_UNQUALIFIED_NAMES",
232+
SystemProcedureFactory<
233+
ParseUnqualifiedNamesInput, ParseUnqualifiedNamesOutput, parseUnqualifiedNamesProcedure>(),
234+
prc_selectable,
235+
// input parameters
236+
{
237+
{"NAMES", fld_text_max, true}
238+
},
239+
// output parameters
240+
{
241+
{"NAME", fld_r_name, false}
242+
}
243+
),
196244
},
197245
// functions
198246
{

src/jrd/sys-packages/SqlPackage.h

+44-2
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
#include "firebird.h"
2727
#include "firebird/Message.h"
2828
#include "../common/classes/array.h"
29+
#include "../common/classes/MetaString.h"
30+
#include "../common/classes/objects_array.h"
2931
#include "../jrd/SystemPackages.h"
3032

3133
namespace Jrd {
@@ -87,10 +89,50 @@ class SqlPackage final : public SystemPackage
8789
Firebird::Array<ExplainOutput::Type>::const_iterator resultIterator = nullptr;
8890
};
8991

90-
//----------
91-
9292
static Firebird::IExternalResultSet* explainProcedure(Firebird::ThrowStatusExceptionWrapper* status,
9393
Firebird::IExternalContext* context, const ExplainInput::Type* in, ExplainOutput::Type* out);
94+
95+
//----------
96+
97+
FB_MESSAGE(ParseUnqualifiedNamesInput, Firebird::ThrowStatusExceptionWrapper,
98+
(FB_INTL_VARCHAR(MAX_VARY_COLUMN_SIZE / METADATA_BYTES_PER_CHAR * METADATA_BYTES_PER_CHAR, CS_METADATA), names)
99+
);
100+
101+
FB_MESSAGE(ParseUnqualifiedNamesOutput, Firebird::ThrowStatusExceptionWrapper,
102+
(FB_INTL_VARCHAR(METADATA_IDENTIFIER_CHAR_LEN * METADATA_BYTES_PER_CHAR, CS_METADATA), name)
103+
);
104+
105+
class ParseUnqualifiedNamesResultSet :
106+
public
107+
Firebird::DisposeIface<
108+
Firebird::IExternalResultSetImpl<
109+
ParseUnqualifiedNamesResultSet,
110+
Firebird::ThrowStatusExceptionWrapper
111+
>
112+
>
113+
{
114+
public:
115+
ParseUnqualifiedNamesResultSet(Firebird::ThrowStatusExceptionWrapper* status, Firebird::IExternalContext* context,
116+
const ParseUnqualifiedNamesInput::Type* in, ParseUnqualifiedNamesOutput::Type* out);
117+
118+
public:
119+
void dispose() override
120+
{
121+
delete this;
122+
}
123+
124+
public:
125+
FB_BOOLEAN fetch(Firebird::ThrowStatusExceptionWrapper* status) override;
126+
127+
private:
128+
ParseUnqualifiedNamesOutput::Type* out;
129+
Firebird::ObjectsArray<Firebird::MetaString> resultEntries{*getDefaultMemoryPool()};
130+
Firebird::ObjectsArray<Firebird::MetaString>::const_iterator resultIterator;
131+
};
132+
133+
static Firebird::IExternalResultSet* parseUnqualifiedNamesProcedure(Firebird::ThrowStatusExceptionWrapper* status,
134+
Firebird::IExternalContext* context,
135+
const ParseUnqualifiedNamesInput::Type* in, ParseUnqualifiedNamesOutput::Type* out);
94136
};
95137

96138

0 commit comments

Comments
 (0)