Skip to content

Commit

Permalink
initial dbms_assert support
Browse files Browse the repository at this point in the history
  • Loading branch information
Pavel Stehule committed Feb 17, 2008
1 parent c2c08ad commit e3d52d6
Show file tree
Hide file tree
Showing 4 changed files with 294 additions and 2 deletions.
2 changes: 1 addition & 1 deletion Makefile
@@ -1,5 +1,5 @@
MODULE_big = orafunc
OBJS= convert.o file.o datefce.o magic.o others.o plvstr.o plvdate.o shmmc.o plvsubst.o utility.o plvlex.o alert.o pipe.o sqlparse.o putline.o
OBJS= convert.o file.o datefce.o magic.o others.o plvstr.o plvdate.o shmmc.o plvsubst.o utility.o plvlex.o alert.o pipe.o sqlparse.o putline.o assert.o

DATA_built = orafunc.sql
DOCS = README.orafunc COPYRIGHT.orafunc INSTALL.orafunc
Expand Down
241 changes: 241 additions & 0 deletions assert.c
@@ -0,0 +1,241 @@
#include "postgres.h"
#include "funcapi.h"
#include "assert.h"
#include "orafunc.h"
#include "miscadmin.h"
#include "utils/acl.h"
#include "utils/builtins.h"
#include "utils/syscache.h"
#include "catalog/namespace.h"

Datum dbms_assert_enquote_literal(PG_FUNCTION_ARGS);
Datum dbms_assert_enquote_name(PG_FUNCTION_ARGS);
Datum dbms_assert_noop(PG_FUNCTION_ARGS);
Datum dbms_assert_qualified_sql_name(PG_FUNCTION_ARGS);
Datum dbms_assert_schema_name(PG_FUNCTION_ARGS);
Datum dbms_assert_simple_sql_name(PG_FUNCTION_ARGS);
Datum dbms_assert_object_name(PG_FUNCTION_ARGS);

PG_FUNCTION_INFO_V1(dbms_assert_enquote_literal);
PG_FUNCTION_INFO_V1(dbms_assert_enquote_name);
PG_FUNCTION_INFO_V1(dbms_assert_noop);
PG_FUNCTION_INFO_V1(dbms_assert_qualified_sql_name);
PG_FUNCTION_INFO_V1(dbms_assert_schema_name);
PG_FUNCTION_INFO_V1(dbms_assert_simple_sql_name);
PG_FUNCTION_INFO_V1(dbms_assert_object_name);


#define CUSTOM_EXCEPTION(code, msg) \
ereport(ERROR, \
(errcode(ERRCODE_ORA_PACKAGES_##code), \
errmsg(msg)))

#define INVALID_SCHEMA_NAME_EXCEPTION() \
CUSTOM_EXCEPTION(INVALID_SCHEMA_NAME, "invalid schema name")

#define INVALID_OBJECT_NAME_EXCEPTION() \
CUSTOM_EXCEPTION(INVALID_OBJECT_NAME, "invalid object name")

#define ISNOT_SIMPLE_SQL_NAME_EXCEPTION() \
CUSTOM_EXCEPTION(ISNOT_SIMPLE_SQL_NAME, "string is not simple SQL name")

#define ISNOT_QUALIFIED_SQL_NAME_EXCEPTION() \
CUSTOM_EXCEPTION(ISNOT_QUALIFIED_SQL_NAME, "string is not qualified SQL name")

#define EMPTY_STR(str) ((VARSIZE(str) - VARHDRSZ) == 0)


/****************************************************************
* DBMS_ASSERT.ENQUOTE_LITERAL
*
* Syntax:
* FUNCTION ENQUOTE_LITERAL(str varchar) RETURNS varchar;
*
* Purpouse:
* Add leading and trailing quotes, verify that all single quotes
* are paired with adjacent single quotes.
*
****************************************************************/

Datum
dbms_assert_enquote_literal(PG_FUNCTION_ARGS)
{
PG_RETURN_DATUM(DirectFunctionCall1(quote_literal, PG_GETARG_DATUM(0)));
}


/****************************************************************
* DBMS_ASSERT.ENQUOTE_NAME
*
* Syntax:
* FUNCTION ENQUOTE_NAME(str varchar) RETURNS varchar;
* FUNCTION ENQUOTE_NAME(str varchar, loweralize boolean := true)
* RETURNS varchar;
* Purpouse:
* Enclose name in double quotes.
* Atention!:
* On Oracle is second parameter capitalize!
*
****************************************************************/

Datum
dbms_assert_enquote_name(PG_FUNCTION_ARGS)
{
Datum name = PG_GETARG_DATUM(0);
bool loweralize = PG_GETARG_BOOL(1);

name = DirectFunctionCall1(quote_ident, name);

if (loweralize)
name = DirectFunctionCall1(lower, name);

PG_RETURN_DATUM(name);
}


/****************************************************************
* DBMS_ASSERT.NOOP
*
* Syntax:
* FUNCTION NOOP(str varchar) RETURNS varchar;
*
* Purpouse:
* Returns value without any checking.
*
****************************************************************/

Datum
dbms_assert_noop(PG_FUNCTION_ARGS)
{
text *str = PG_GETARG_TEXT_P(0);

PG_RETURN_TEXT_P(TextPCopy(str));
}


/****************************************************************
* DBMS_ASSERT.QUALIFIED_SQL_NAME
*
* Syntax:
* FUNCTION QUALIFIED_SQL_NAME(str varchar) RETURNS varchar;
*
* Purpouse:
* This function verifies that the input string is qualified SQL
* name.
* Exception: 44004 string is not a qualified SQL name
*
****************************************************************/

Datum
dbms_assert_qualified_sql_name(PG_FUNCTION_ARGS)
{
PG_RETURN_NULL();
}


/****************************************************************
* DBMS_ASSERT.SCHEMA_NAME
*
* Syntax:
* FUNCTION SCHEMA_NAME(str varchar) RETURNS varchar;
*
* Purpouse:
* Function verifies that input string is an existing schema
* name.
* Exception: 44001 Invalid schema name
*
****************************************************************/

Datum
dbms_assert_schema_name(PG_FUNCTION_ARGS)
{
Oid namespaceId;
AclResult aclresult;
text *sname;
char *nspname;
List *names;

if (PG_ARGISNULL(0))
INVALID_SCHEMA_NAME_EXCEPTION();

sname = PG_GETARG_TEXT_P(0);
if (EMPTY_STR(sname))
INVALID_SCHEMA_NAME_EXCEPTION();

nspname = TextPGetCString(sname);
names = stringToQualifiedNameList(nspname);
if (list_length(names) != 1)
INVALID_SCHEMA_NAME_EXCEPTION();

namespaceId = GetSysCacheOid(NAMESPACENAME,
CStringGetDatum(strVal(linitial(names))),
0, 0, 0);
if (!OidIsValid(namespaceId))
INVALID_SCHEMA_NAME_EXCEPTION();

aclresult = pg_namespace_aclcheck(namespaceId, GetUserId(), ACL_USAGE);
if (aclresult != ACLCHECK_OK)
INVALID_SCHEMA_NAME_EXCEPTION();

PG_RETURN_TEXT_P(sname);
}


/****************************************************************
* DBMS_ASSERT.SIMPLE_SQL_NAME
*
* Syntax:
* FUNCTION SIMPLE_SQL_NAME(str varchar) RETURNS varchar;
*
* Purpouse:
* This function verifies that the input string is simple SQL
* name.
* Exception: 44003 String is not a simple SQL name
*
****************************************************************/

Datum
dbms_assert_simple_sql_name(PG_FUNCTION_ARGS)
{
PG_RETURN_NULL();
}


/****************************************************************
* DBMS_ASSERT.OBJECT_NAME
*
* Syntax:
* FUNCTION OBJECT_NAME(str varchar) RETURNS varchar;
*
* Purpouse:
* Verifies that input string is qualified SQL identifier of
* an existing SQL object.
* Exception: 44002 Invalid object name
*
****************************************************************/

Datum
dbms_assert_object_name(PG_FUNCTION_ARGS)
{
List *names;
text *str;
char *object_name;
Oid classId;

if (PG_ARGISNULL(0))
INVALID_OBJECT_NAME_EXCEPTION();

str = PG_GETARG_TEXT_P(0);
if (EMPTY_STR(str))
INVALID_OBJECT_NAME_EXCEPTION();

object_name = TextPGetCString(str);

names = stringToQualifiedNameList(object_name);

classId = RangeVarGetRelid(makeRangeVarFromNameList(names), true);
if (!OidIsValid(classId))
INVALID_OBJECT_NAME_EXCEPTION();

PG_RETURN_TEXT_P(str);
}
9 changes: 9 additions & 0 deletions assert.h
@@ -0,0 +1,9 @@
#ifndef __ASSERT__
#define __ASSERT__

#define ERRCODE_ORA_PACKAGES_INVALID_SCHEMA_NAME MAKE_SQLSTATE('4','4','0','0','1')
#define ERRCODE_ORA_PACKAGES_INVALID_OBJECT_NAME MAKE_SQLSTATE('4','4','0','0','2')
#define ERRCODE_ORA_PACKAGES_ISNOT_SIMPLE_SQL_NAME MAKE_SQLSTATE('4','4','0','0','3')
#define ERRCODE_ORA_PACKAGES_ISNOT_QUALIFIED_SQL_NAME MAKE_SQLSTATE('4','4','0','0','4')

#endif
44 changes: 43 additions & 1 deletion orafunc.sql.in
Expand Up @@ -1240,6 +1240,48 @@ COMMENT ON FUNCTION utl_file.fclose_all() IS 'Close all open files.';
CREATE TABLE utl_file.utl_file_dir(dir text);
REVOKE ALL ON utl_file.utl_file_dir FROM PUBLIC;

-- dbms_assert

DROP SCHEMA IF EXISTS dbms_assert CASCADE;
CREATE SCHEMA dbms_assert;

CREATE FUNCTION dbms_assert.enquote_literal(str varchar)
RETURNS varchar
AS 'MODULE_PATHNAME','dbms_assert_enquote_literal'
LANGUAGE C IMMUTABLE STRICT;
COMMENT ON FUNCTION dbms_assert.enquote_literal(varchar) IS 'Add leading and trailing quotes, verify that all single quotes are paired with adjacent single quotes';

CREATE FUNCTION dbms_assert.enquote_name(str varchar, loweralize boolean)
RETURNS varchar
AS 'MODULE_PATHNAME','dbms_assert_enquote_name'
LANGUAGE C IMMUTABLE;
COMMENT ON FUNCTION dbms_assert.enquote_name(varchar, boolean) IS 'Enclose name in double quotes';

CREATE FUNCTION dbms_assert.enquote_name(str varchar)
RETURNS varchar
AS 'SELECT dbms_assert.enquote_name($1, true)'
LANGUAGE SQL IMMUTABLE;
COMMENT ON FUNCTION dbms_assert.enquote_name(varchar) IS 'Enclose name in double quotes';

CREATE FUNCTION dbms_assert.noop(str varchar)
RETURNS varchar
AS 'MODULE_PATHNAME','dbms_assert_noop'
LANGUAGE C IMMUTABLE;
COMMENT ON FUNCTION dbms_assert.noop(varchar) IS 'Returns value without any checking.';

CREATE FUNCTION dbms_assert.schema_name(str varchar)
RETURNS varchar
AS 'MODULE_PATHNAME','dbms_assert_schema_name'
LANGUAGE C IMMUTABLE;
COMMENT ON FUNCTION dbms_assert.schema_name(varchar) IS 'Verify input string is an existing schema name.';

CREATE FUNCTION dbms_assert.object_name(str varchar)
RETURNS varchar
AS 'MODULE_PATHNAME','dbms_assert_object_name'
LANGUAGE C IMMUTABLE;
COMMENT ON FUNCTION dbms_assert.object_name(varchar) IS 'Verify input string is an existing object name.';


GRANT USAGE ON SCHEMA dbms_pipe TO PUBLIC;
GRANT USAGE ON SCHEMA dbms_alert TO PUBLIC;
GRANT USAGE ON SCHEMA plvdate TO PUBLIC;
Expand All @@ -1251,4 +1293,4 @@ GRANT SELECT ON dbms_pipe.db_pipes to PUBLIC;
GRANT USAGE ON SCHEMA dbms_utility TO PUBLIC;
GRANT USAGE ON SCHEMA plvlex TO PUBLIC;
GRANT USAGE ON SCHEMA utl_file TO PUBLIC;

GRANT USAGE ON SCHEMA dbms_assert TO PUBLIC;

0 comments on commit e3d52d6

Please sign in to comment.