mirror of
https://github.com/apache/impala.git
synced 2026-01-09 15:00:11 -05:00
sqlparse-0.1.19 is the last version of sqlparse that supports Python 2.6. Testing: - Ran all end-to-end tests Change-Id: Ide51ef3ac52d25a96b0fa832e29b6535197d23cb Reviewed-on: http://gerrit.cloudera.org:8080/10354 Reviewed-by: David Knupp <dknupp@cloudera.com> Tested-by: Impala Public Jenkins <impala-public-jenkins@cloudera.com>
72 lines
3.0 KiB
PL/PgSQL
72 lines
3.0 KiB
PL/PgSQL
CREATE OR REPLACE FUNCTION public.delete_data (
|
|
p_tabelle VARCHAR
|
|
, p_key VARCHAR
|
|
, p_value INTEGER
|
|
) RETURNS INTEGER AS
|
|
$$
|
|
DECLARE
|
|
p_retval INTEGER;
|
|
v_constraint RECORD;
|
|
v_count INTEGER;
|
|
v_data RECORD;
|
|
v_fieldname VARCHAR;
|
|
v_sql VARCHAR;
|
|
v_key VARCHAR;
|
|
v_value INTEGER;
|
|
BEGIN
|
|
v_sql := 'SELECT COUNT(*) FROM ' || p_tabelle || ' WHERE ' || p_key || ' = ' || p_value;
|
|
--RAISE NOTICE '%', v_sql;
|
|
EXECUTE v_sql INTO v_count;
|
|
IF v_count::integer != 0 THEN
|
|
SELECT att.attname
|
|
INTO v_key
|
|
FROM pg_attribute att
|
|
LEFT JOIN pg_constraint con ON con.conrelid = att.attrelid
|
|
AND con.conkey[1] = att.attnum
|
|
AND con.contype = 'p', pg_type typ, pg_class rel, pg_namespace ns
|
|
WHERE att.attrelid = rel.oid
|
|
AND att.attnum > 0
|
|
AND typ.oid = att.atttypid
|
|
AND att.attisdropped = false
|
|
AND rel.relname = p_tabelle
|
|
AND con.conkey[1] = 1
|
|
AND ns.oid = rel.relnamespace
|
|
AND ns.nspname = 'public'
|
|
ORDER BY att.attnum;
|
|
v_sql := 'SELECT ' || v_key || ' AS id FROM ' || p_tabelle || ' WHERE ' || p_key || ' = ' || p_value;
|
|
FOR v_data IN EXECUTE v_sql
|
|
LOOP
|
|
--RAISE NOTICE ' -> % %', p_tabelle, v_data.id;
|
|
FOR v_constraint IN SELECT t.constraint_name
|
|
, t.constraint_type
|
|
, t.table_name
|
|
, c.column_name
|
|
FROM public.v_table_constraints t
|
|
, public.v_constraint_columns c
|
|
WHERE t.constraint_name = c.constraint_name
|
|
AND t.constraint_type = 'FOREIGN KEY'
|
|
AND c.table_name = p_tabelle
|
|
AND t.table_schema = 'public'
|
|
AND c.table_schema = 'public'
|
|
LOOP
|
|
v_fieldname := substring(v_constraint.constraint_name from 1 for length(v_constraint.constraint_name) - length(v_constraint.column_name) - 1);
|
|
IF (v_constraint.table_name = p_tabelle) AND (p_value = v_data.id) THEN
|
|
--RAISE NOTICE 'Skip (Selbstverweis)';
|
|
CONTINUE;
|
|
ELSE
|
|
PERFORM delete_data(v_constraint.table_name::varchar, v_fieldname::varchar, v_data.id::integer);
|
|
END IF;
|
|
END LOOP;
|
|
END LOOP;
|
|
v_sql := 'DELETE FROM ' || p_tabelle || ' WHERE ' || p_key || ' = ' || p_value;
|
|
--RAISE NOTICE '%', v_sql;
|
|
EXECUTE v_sql;
|
|
p_retval := 1;
|
|
ELSE
|
|
--RAISE NOTICE ' -> Keine Sätze gefunden';
|
|
p_retval := 0;
|
|
END IF;
|
|
RETURN p_retval;
|
|
END;
|
|
$$
|
|
LANGUAGE plpgsql; |