Function Properties
Language: PLPGSQL
Return Type: text
quote all words that aren't quoted yetdeclare p_tab_fqname alias for $1; v_nsp_name text; v_tab_name text; v_i integer; v_l integer; v_pq2 integer; begin v_l := length(p_tab_fqname); -- Let us search for the dot if p_tab_fqname like '"%' then -- if the first part of the ident starts with a double quote, search -- for the closing double quote, skipping over double double quotes. v_i := 2; while v_i <= v_l loop if substr(p_tab_fqname, v_i, 1) != '"' then v_i := v_i + 1; else v_i := v_i + 1; if substr(p_tab_fqname, v_i, 1) != '"' then exit; end if; v_i := v_i + 1; end if; end loop; else -- first part of ident is not quoted, search for the dot directly v_i := 1; while v_i <= v_l loop if substr(p_tab_fqname, v_i, 1) = '.' then exit; end if; v_i := v_i + 1; end loop; end if; -- v_i now points at the dot or behind the string. if substr(p_tab_fqname, v_i, 1) = '.' then -- There is a dot now, so split the ident into its namespace -- and objname parts and make sure each is quoted v_nsp_name := substr(p_tab_fqname, 1, v_i - 1); v_tab_name := substr(p_tab_fqname, v_i + 1); if v_nsp_name not like '"%' then v_nsp_name := '"' || replace(v_nsp_name, '"', '""') || '"'; end if; if v_tab_name not like '"%' then v_tab_name := '"' || replace(v_tab_name, '"', '""') || '"'; end if; return v_nsp_name || '.' || v_tab_name; else -- No dot ... must be just an ident without schema if p_tab_fqname like '"%' then return p_tab_fqname; else return '"' || replace(p_tab_fqname, '"', '""') || '"'; end if; end if; end;