Fri Jun 2 11:49:09 PDT 2006
- Previous message: [Slony1-commit] By wieck: Fixed escaping of double quotes in identifiers.
- Next message: [Slony1-commit] By cbbrowne: Fix to run_test.sh; there were several places where "-d2"
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Log Message: ----------- Fixed double quote escaping and \' problems. Jan Modified Files: -------------- slony1-engine/src/backend: slony1_funcs.sql (r1.84 -> r1.85) slony1-engine/src/slon: remote_worker.c (r1.113 -> r1.114) -------------- next part -------------- Index: slony1_funcs.sql =================================================================== RCS file: /usr/local/cvsroot/slony1/slony1-engine/src/backend/slony1_funcs.sql,v retrieving revision 1.84 retrieving revision 1.85 diff -Lsrc/backend/slony1_funcs.sql -Lsrc/backend/slony1_funcs.sql -u -w -r1.84 -r1.85 --- src/backend/slony1_funcs.sql +++ src/backend/slony1_funcs.sql @@ -302,7 +302,7 @@ p_tab_fqname alias for $1; v_fqname text default ''''; begin - v_fqname := ''"'' || replace(p_tab_fqname,''\"'',''\\\\"'') || ''"''; + v_fqname := ''"'' || replace(p_tab_fqname,''"'',''""'') || ''"''; return v_fqname; end; ' language plpgsql; @@ -319,84 +319,70 @@ -- -- This function will be used to quote user input. -- ---------------------------------------------------------------------- - ---create or replace function @NAMESPACE at .slon_quote_input (text) returns text ---as ' ---declare --- p_tab_fqname alias for $1; --- v_temp_fqname text default ''''; --- v_pre_quoted text[] default ''{}''; --- v_pre_quote_counter smallint default 0; --- v_count_fqname smallint default 0; --- v_fqname_split text[]; --- v_quoted_fqname text default ''''; ---begin --- v_temp_fqname := p_tab_fqname; - --- LOOP --- v_pre_quote_counter := v_pre_quote_counter + 1; --- v_pre_quoted[v_pre_quote_counter] := --- substring(v_temp_fqname from ''%#"\"%\"#"%'' for ''#''); --- IF v_pre_quoted[v_pre_quote_counter] <> '''' THEN --- v_temp_fqname := replace(v_temp_fqname, --- v_pre_quoted[v_pre_quote_counter], ''@'' || --- v_pre_quote_counter); --- ELSE --- EXIT; --- END IF; --- END LOOP; - --- v_fqname_split := string_to_array(v_temp_fqname , ''.''); --- v_count_fqname := array_upper (v_fqname_split, 1); - --- FOR i in 1..v_count_fqname LOOP --- IF substring(v_fqname_split[i],1,1) = ''@'' THEN --- v_quoted_fqname := v_quoted_fqname || --- v_pre_quoted[substring (v_fqname_split[i] from 2)::int]; --- ELSE --- v_quoted_fqname := v_quoted_fqname || ''"'' || --- v_fqname_split[i] || ''"''; --- END IF; - --- IF i < v_count_fqname THEN --- v_quoted_fqname := v_quoted_fqname || ''.'' ; --- END IF; --- END LOOP; - --- return v_quoted_fqname; ---end; ---' language plpgsql; - - create or replace function @NAMESPACE at .slon_quote_input(text) returns text as ' 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 - if (p_tab_fqname like ''"%"."%"'') then - v_pq2 := position (''"'' in substr(p_tab_fqname, 2)); - v_nsp_name := substr(p_tab_fqname, 2, v_pq2 - 1); - v_tab_name := substr(p_tab_fqname, v_pq2 + 4, length(p_tab_fqname) - (v_pq2 + 4)); - elsif (p_tab_fqname like ''"%".%'') then - v_pq2 := position (''"'' in substr(p_tab_fqname, 2)); - v_nsp_name := substr(p_tab_fqname, 2, v_pq2 - 1); - v_tab_name := substr(p_tab_fqname, v_pq2 + 3, length(p_tab_fqname) - (v_pq2 + 2)); - elsif (p_tab_fqname like ''%."%"'') then - v_pq2 := position (''.'' in substr(p_tab_fqname, 2)); - v_nsp_name := substr(p_tab_fqname, 1, v_pq2); - v_tab_name := substr(p_tab_fqname, v_pq2 + 3, length(p_tab_fqname) - (v_pq2 + 3)); - elsif (p_tab_fqname like ''%.%'') then - v_pq2 := position (''.'' in substr(p_tab_fqname, 2)); - v_nsp_name := substr(p_tab_fqname, 1, v_pq2); - v_tab_name := substr(p_tab_fqname, v_pq2 + 2); - elsif (p_tab_fqname like ''"%"'') then + 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; + continue; + end if; + v_i := v_i + 1; + if substr(p_tab_fqname, v_i, 1) != ''"'' then + exit; + end if; + v_i := v_i + 1; + 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 ''"'' || p_tab_fqname || ''"''; + return ''"'' || replace(p_tab_fqname, ''"'', ''""'') || ''"''; + end if; end if; - return ''"'' || v_nsp_name || ''"."'' || v_tab_name || ''"''; + end;' language plpgsql; comment on function @NAMESPACE at .slon_quote_input(text) is @@ -2700,11 +2686,11 @@ and @NAMESPACE at .slon_quote_input(p_fqname) = @NAMESPACE at .slon_quote_brute(PGN.nspname) || ''.'' || @NAMESPACE at .slon_quote_brute(PGC.relname); if not found then - raise exception ''Slony-I: setAddTable(): table % not found'', + raise exception ''Slony-I: setAddTable_int(): table % not found'', p_fqname; end if; if v_relkind != ''r'' then - raise exception ''Slony-I: setAddTable(): % is not a regular table'', + raise exception ''Slony-I: setAddTable_int(): % is not a regular table'', p_fqname; end if; @@ -2714,7 +2700,7 @@ and PGX.indexrelid = PGC.oid and PGC.relname = p_tab_idxname) then - raise exception ''Slony-I: setAddTable(): table % has no index %'', + raise exception ''Slony-I: setAddTable_int(): table % has no index %'', p_fqname, p_tab_idxname; end if; @@ -5080,14 +5066,14 @@ v_blacklist alias for $2 ; v_ignore int4[] ; v_reachable_edge_last int4[] ; - v_reachable_edge_new int4[] default \'{}\' ; + v_reachable_edge_new int4[] default ''{}'' ; v_server record ; begin v_reachable_edge_last := array[v_node] ; v_ignore := v_blacklist || array[v_node] ; return next v_node ; - while v_reachable_edge_last != \'{}\' loop - v_reachable_edge_new := \'{}\' ; + while v_reachable_edge_last != ''{}'' loop + v_reachable_edge_new := ''{}'' ; for v_server in select pa_server as no_id from @NAMESPACE at .sl_path where pa_client = ANY(v_reachable_edge_last) and pa_server != ALL(v_ignore) Index: remote_worker.c =================================================================== RCS file: /usr/local/cvsroot/slony1/slony1-engine/src/slon/remote_worker.c,v retrieving revision 1.113 retrieving revision 1.114 diff -Lsrc/slon/remote_worker.c -Lsrc/slon/remote_worker.c -u -w -r1.113 -r1.114 --- src/slon/remote_worker.c +++ src/slon/remote_worker.c @@ -2776,8 +2776,8 @@ */ slon_mkquery(&query1, "select T.tab_id, " - " %s.slon_quote_input('\"' || PGN.nspname || '\".\"' || " - " PGC.relname || '\"') as tab_fqname, " + " %s.slon_quote_brute(PGN.nspname) || '.' || " + " %s.slon_quote_brute(PGC.relname) as tab_fqname, " " T.tab_idxname, T.tab_comment " "from %s.sl_table T, " " \"pg_catalog\".pg_class PGC, " @@ -2788,6 +2788,7 @@ "order by tab_id; ", rtcfg_namespace, rtcfg_namespace, + rtcfg_namespace, set_id); res1 = PQexec(pro_dbconn, dstring_data(&query1)); if (PQresultStatus(res1) != PGRES_TUPLES_OK) @@ -2931,8 +2932,8 @@ */ slon_mkquery(&query1, "select SQ.seq_id, " - " %s.slon_quote_input('\"' || PGN.nspname || '\".\"' || " - " PGC.relname || '\"') as tab_fqname, " + " %s.slon_quote_brute(PGN.nspname) || '.' || " + " %s.slon_quote_brute(PGC.relname) as tab_fqname, " " SQ.seq_comment " " from %s.sl_sequence SQ, " " \"pg_catalog\".pg_class PGC, " @@ -2942,6 +2943,7 @@ " and PGN.oid = PGC.relnamespace; ", rtcfg_namespace, rtcfg_namespace, + rtcfg_namespace, set_id); res1 = PQexec(pro_dbconn, dstring_data(&query1)); if (PQresultStatus(res1) != PGRES_TUPLES_OK) @@ -2993,8 +2995,8 @@ */ slon_mkquery(&query1, "select T.tab_id, " - " %s.slon_quote_input('\"' || PGN.nspname || '\".\"' || " - " PGC.relname || '\"') as tab_fqname, " + " %s.slon_quote_brute(PGN.nspname) || '.' || " + " %s.slon_quote_brute(PGC.relname) as tab_fqname, " " T.tab_idxname, T.tab_comment " "from %s.sl_table T, " " \"pg_catalog\".pg_class PGC, " @@ -3005,6 +3007,7 @@ "order by tab_id; ", rtcfg_namespace, rtcfg_namespace, + rtcfg_namespace, set_id); res1 = PQexec(pro_dbconn, dstring_data(&query1)); if (PQresultStatus(res1) != PGRES_TUPLES_OK) @@ -3605,8 +3608,8 @@ */ slon_mkquery(&query1, "select SL.seql_seqid, SL.seql_last_value, " - " %s.slon_quote_input('\"' || PGN.nspname || '\".\"' || " - " PGC.relname || '\"') as tab_fqname " + " %s.slon_quote_brute(PGN.nspname) || '.' || " + " %s.slon_quote_brute(PGC.relname) as tab_fqname " " from %s.sl_sequence SQ, %s.sl_seqlog SL, " " \"pg_catalog\".pg_class PGC, " " \"pg_catalog\".pg_namespace PGN " @@ -3618,6 +3621,7 @@ rtcfg_namespace, rtcfg_namespace, rtcfg_namespace, + rtcfg_namespace, set_id, seqbuf); res1 = PQexec(pro_dbconn, dstring_data(&query1)); if (PQresultStatus(res1) != PGRES_TUPLES_OK) @@ -4273,8 +4277,8 @@ */ slon_mkquery(&query, "select T.tab_id, T.tab_set, " - " %s.slon_quote_input('\"' || PGN.nspname || '\".\"' || " - " PGC.relname || '\"') as tab_fqname " + " %s.slon_quote_brute(PGN.nspname) || '.' || " + " %s.slon_quote_brute(PGC.relname) as tab_fqname " "from %s.sl_table T, " " \"pg_catalog\".pg_class PGC, " " \"pg_catalog\".pg_namespace PGN " @@ -4283,6 +4287,7 @@ " and PGC.relnamespace = PGN.oid; ", rtcfg_namespace, rtcfg_namespace, + rtcfg_namespace, sub_set); res2 = PQexec(local_dbconn, dstring_data(&query)); if (PQresultStatus(res2) != PGRES_TUPLES_OK)
- Previous message: [Slony1-commit] By wieck: Fixed escaping of double quotes in identifiers.
- Next message: [Slony1-commit] By cbbrowne: Fix to run_test.sh; there were several places where "-d2"
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the Slony1-commit mailing list