Skip to content

Commit

Permalink
Add function is_valid_label_name (#1911) (#1912)
Browse files Browse the repository at this point in the history
Added the function is_valid_label_name (#1911) per user request.

This function will return a boolean value for any agtype string
passed, depending on whether it is a valid name for a label. For
all other types, not an agtype string, it will error out. Depending
on user requirements, this could be changed in the future.

Added regression tests.
  • Loading branch information
jrgemignani committed Jun 14, 2024
1 parent 881e6f5 commit 7e8c3f8
Show file tree
Hide file tree
Showing 4 changed files with 87 additions and 0 deletions.
27 changes: 27 additions & 0 deletions regress/expected/name_validation.out
Original file line number Diff line number Diff line change
Expand Up @@ -369,6 +369,33 @@ SELECT * from cypher('graph123', $$ CREATE (:A)-[:`mylabel2`]->(:C) $$) as (a ag
---
(0 rows)

-- user label validation
-- invalid
SELECT * from cypher('graph123', $$ return is_valid_label_name('1label') $$) as (result agtype);
result
--------
false
(1 row)

SELECT * from cypher('graph123', $$ return is_valid_label_name('2label') $$) as (result agtype);
result
--------
false
(1 row)

-- valid
SELECT * from cypher('graph123', $$ return is_valid_label_name('label1') $$) as (result agtype);
result
--------
true
(1 row)

SELECT * from cypher('graph123', $$ return is_valid_label_name('label2') $$) as (result agtype);
result
--------
true
(1 row)

-- clean up
SELECT drop_graph('graph123', true);
NOTICE: drop cascades to 18 other objects
Expand Down
8 changes: 8 additions & 0 deletions regress/sql/name_validation.sql
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,14 @@ SELECT * from cypher('graph123', $$ CREATE (:A)-[:`my&label2`]->(:C) $$) as (a a
SELECT * from cypher('graph123', $$ CREATE (a:`mylabel`) $$) as (a agtype);
SELECT * from cypher('graph123', $$ CREATE (:A)-[:`mylabel2`]->(:C) $$) as (a agtype);

-- user label validation
-- invalid
SELECT * from cypher('graph123', $$ return is_valid_label_name('1label') $$) as (result agtype);
SELECT * from cypher('graph123', $$ return is_valid_label_name('2label') $$) as (result agtype);
-- valid
SELECT * from cypher('graph123', $$ return is_valid_label_name('label1') $$) as (result agtype);
SELECT * from cypher('graph123', $$ return is_valid_label_name('label2') $$) as (result agtype);

-- clean up
SELECT drop_graph('graph123', true);

Expand Down
7 changes: 7 additions & 0 deletions sql/agtype_string.sql
Original file line number Diff line number Diff line change
Expand Up @@ -51,3 +51,10 @@ CREATE FUNCTION ag_catalog.age_eq_tilde(agtype, agtype)
STABLE
PARALLEL SAFE
AS 'MODULE_PATHNAME';

CREATE FUNCTION ag_catalog.age_is_valid_label_name(agtype)
RETURNS boolean
LANGUAGE c
IMMUTABLE
PARALLEL SAFE
AS 'MODULE_PATHNAME';
45 changes: 45 additions & 0 deletions src/backend/commands/label_commands.c
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,52 @@ static void range_var_callback_for_remove_relation(const RangeVar *rel,
Oid odl_rel_oid,
void *arg);

PG_FUNCTION_INFO_V1(age_is_valid_label_name);

Datum age_is_valid_label_name(PG_FUNCTION_ARGS)
{
agtype *agt_arg = NULL;
agtype_value *agtv_value = NULL;
char *label_name = NULL;
bool is_valid = false;

if (PG_ARGISNULL(0))
{
ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("label name must not be NULL")));
}

agt_arg = AG_GET_ARG_AGTYPE_P(0);

if (!AGT_ROOT_IS_SCALAR(agt_arg))
{
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("is_valid_label_name() only supports scalar arguments")));
}

agtv_value = get_ith_agtype_value_from_container(&agt_arg->root, 0);

if (agtv_value->type != AGTV_STRING)
{
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("is_valid_label_name() only supports string arguments")));
}

label_name = pnstrdup(agtv_value->val.string.val,
agtv_value->val.string.len);

is_valid = is_valid_label(label_name, 0);
pfree(label_name);

if (is_valid)
{
PG_RETURN_BOOL(true);
}

PG_RETURN_BOOL(false);
}

PG_FUNCTION_INFO_V1(create_vlabel);

Expand Down

0 comments on commit 7e8c3f8

Please sign in to comment.