1.110.  slon_quote_input( text )

Propriétés de la fonction
Langage: PLPGSQL
Type du code retour: text

Met entre guillemets tous les mots qui ne le sont pas encore.

declare
     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;