Skip to content

Commit 8434c08

Browse files
author
Thiago Guimarães
committed
Fix issue #432
1 parent 6ca3502 commit 8434c08

File tree

2 files changed

+251
-3
lines changed

2 files changed

+251
-3
lines changed

src/DebugBar/DataCollector/PDO/TracedStatement.php

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -123,14 +123,19 @@ public function getSqlWithParams($quotationChar = '<>')
123123
}
124124

125125
$matchRule = "/({$marker}(?!\w))(?=(?:[^$quotationChar]|[$quotationChar][^$quotationChar]*[$quotationChar])*$)/";
126-
for ($i = 0; $i <= mb_substr_count($sql, $k); $i++) {
127-
$sql = preg_replace($matchRule, $v, $sql, 1);
126+
$sqlSplit = explode(PHP_EOL, $sql);
127+
$sql = null;
128+
foreach ($sqlSplit as $pieces) {
129+
for ($i = 0; $i <= mb_substr_count($pieces, $k); $i++) {
130+
$pieces = preg_replace($matchRule, $v, $pieces, 1);
131+
}
132+
$sql .= $pieces . PHP_EOL;
128133
}
129134
}
130135

131136
$sql = strtr($sql, array_flip($cleanBackRefCharMap));
132137

133-
return $sql;
138+
return trim($sql);
134139
}
135140

136141
/**

tests/DebugBar/Tests/TracedStatementTest.php

Lines changed: 243 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,4 +150,247 @@ public function testRepeadParamsQuery()
150150
$result = $traced->getSqlWithParams();
151151
$this->assertEquals($expected, $result);
152152
}
153+
/**
154+
* Big query generate regex error
155+
*/
156+
public function testBigQuery()
157+
{
158+
$params = [
159+
':id_segmento' => 1,
160+
':id_part' => 1,
161+
':inativo' => 1,
162+
':ativo' => 1
163+
];
164+
$query = 'select sum(qtd) as total from (
165+
select count(*) as qtd from (
166+
select distinct vw.id_modulo, vw.id_envio, vw.id_form,
167+
vw.versao, vw.id_sistema, vw.id_grupo
168+
from vw_forms_disponiveis vw
169+
where vw.id_part = :id_part
170+
and vw.id_servico = :id_segmento
171+
and vw.concluido = :inativo
172+
) as forms
173+
174+
union
175+
select distinct count(pesq.*) as qtd from
176+
pesquisa.avaliacao_modulo_disponivel pesq
177+
join envio e
178+
on e.id_envio = pesq.id_envio
179+
and e.id_servico = pesq.id_servico
180+
join rodada r
181+
on e.id_envio = r.id_envio
182+
join part_form pf
183+
on r.ano = pf.ano
184+
and r.id_rodada = pf.id_rodada
185+
and pf.id_modulo = r.id_modulo
186+
where pf.id_part = :id_part
187+
and (
188+
r.data_fim > date(now())
189+
or pf.data_excecao_fim > date(now())
190+
)
191+
and (
192+
r.data_ini <= date(now())
193+
or pf.data_excecao_ini <= date(now())
194+
)
195+
and e.id_servico = :id_segmento
196+
and pesq.id_modulo = :inativo
197+
198+
union
199+
select distinct count(p.id_pesquisa) as qtd
200+
from pesquisas.pesquisa p
201+
join pesquisas.publicacao as pub
202+
on pub.id_pesquisa = p.id_pesquisa
203+
left join pesquisas.resposta r
204+
on r.id_pesquisa = p.id_pesquisa
205+
and r.id_publicacao = pub.id_publicacao
206+
and r.id_part = :id_part
207+
where pub.id_servico = :id_segmento
208+
and pub.excluido = :inativo
209+
and p.excluido = :inativo
210+
and r.id_resposta is null
211+
and pub.data_ini <= date(now())
212+
and pub.data_fim >= date (now())
213+
and (
214+
p.resp_primeira_publicacao = :inativo
215+
or (
216+
pub.id_publicacao in (
217+
select r2.id_publicacao
218+
from pesquisas.resposta r2
219+
where r2.id_part = :id_part
220+
and r2.id_pesquisa = p.id_pesquisa
221+
)
222+
)
223+
or (
224+
not exists (
225+
select r2.id_pesquisa
226+
from pesquisas.resposta r2
227+
where r2.id_part = :id_part
228+
and r2.id_pesquisa = p.id_pesquisa
229+
)
230+
)
231+
)
232+
and (
233+
pub.todos_parts = :ativo
234+
or :id_part in (
235+
select id_part
236+
from pesquisas.publicacao_part pp
237+
where pp.id_pesquisa = pub.id_pesquisa
238+
and pp.id_publicacao = pub.id_publicacao
239+
and pp.id_part = :id_part
240+
)
241+
)
242+
243+
union
244+
select count(es.*) as qtd from especial.solicitacao es
245+
join especial.dados_solicitacao d
246+
on es.id_servico = d.id_servico
247+
and es.ano = d.ano
248+
join especial.liberacao el
249+
on el.ano = d.ano
250+
and el.id_servico = d.id_servico
251+
and el.id_part = es.id_part
252+
left join especial.prorrogados p
253+
on p.ano = el.ano
254+
and p.id_servico = el.id_servico
255+
and p.id_part = el.id_part
256+
where es.id_usu is null -- possui resp
257+
and el.id_servico = :id_segmento
258+
and el.id_part = :id_part
259+
and (
260+
el.id_part in (8005, 8012)
261+
or
262+
d.liberada = :ativo
263+
)
264+
and ((d.data_ini <= date(now()) and d.data_fim >= date(now()))
265+
or (
266+
d.data_ini_excecao <= date(now())
267+
and d.data_fim_excecao >= date(now())
268+
and p.id_part not in (
269+
select s.id_part from especial.solicitacao s
270+
where s.data < d.data_ini_excecao
271+
and s.id_part = el.id_part and s.ano = d.ano
272+
and s.id_servico = d.id_servico
273+
)
274+
)
275+
or (p.data_fim >= date(now()))
276+
)
277+
) as resultados_em_aberto';
278+
$expected = 'select sum(qtd) as total from (
279+
select count(*) as qtd from (
280+
select distinct vw.id_modulo, vw.id_envio, vw.id_form,
281+
vw.versao, vw.id_sistema, vw.id_grupo
282+
from vw_forms_disponiveis vw
283+
where vw.id_part = <1>
284+
and vw.id_servico = <1>
285+
and vw.concluido = <1>
286+
) as forms
287+
288+
union
289+
select distinct count(pesq.*) as qtd from
290+
pesquisa.avaliacao_modulo_disponivel pesq
291+
join envio e
292+
on e.id_envio = pesq.id_envio
293+
and e.id_servico = pesq.id_servico
294+
join rodada r
295+
on e.id_envio = r.id_envio
296+
join part_form pf
297+
on r.ano = pf.ano
298+
and r.id_rodada = pf.id_rodada
299+
and pf.id_modulo = r.id_modulo
300+
where pf.id_part = <1>
301+
and (
302+
r.data_fim > date(now())
303+
or pf.data_excecao_fim > date(now())
304+
)
305+
and (
306+
r.data_ini <= date(now())
307+
or pf.data_excecao_ini <= date(now())
308+
)
309+
and e.id_servico = <1>
310+
and pesq.id_modulo = <1>
311+
312+
union
313+
select distinct count(p.id_pesquisa) as qtd
314+
from pesquisas.pesquisa p
315+
join pesquisas.publicacao as pub
316+
on pub.id_pesquisa = p.id_pesquisa
317+
left join pesquisas.resposta r
318+
on r.id_pesquisa = p.id_pesquisa
319+
and r.id_publicacao = pub.id_publicacao
320+
and r.id_part = <1>
321+
where pub.id_servico = <1>
322+
and pub.excluido = <1>
323+
and p.excluido = <1>
324+
and r.id_resposta is null
325+
and pub.data_ini <= date(now())
326+
and pub.data_fim >= date (now())
327+
and (
328+
p.resp_primeira_publicacao = <1>
329+
or (
330+
pub.id_publicacao in (
331+
select r2.id_publicacao
332+
from pesquisas.resposta r2
333+
where r2.id_part = <1>
334+
and r2.id_pesquisa = p.id_pesquisa
335+
)
336+
)
337+
or (
338+
not exists (
339+
select r2.id_pesquisa
340+
from pesquisas.resposta r2
341+
where r2.id_part = <1>
342+
and r2.id_pesquisa = p.id_pesquisa
343+
)
344+
)
345+
)
346+
and (
347+
pub.todos_parts = <1>
348+
or <1> in (
349+
select id_part
350+
from pesquisas.publicacao_part pp
351+
where pp.id_pesquisa = pub.id_pesquisa
352+
and pp.id_publicacao = pub.id_publicacao
353+
and pp.id_part = <1>
354+
)
355+
)
356+
357+
union
358+
select count(es.*) as qtd from especial.solicitacao es
359+
join especial.dados_solicitacao d
360+
on es.id_servico = d.id_servico
361+
and es.ano = d.ano
362+
join especial.liberacao el
363+
on el.ano = d.ano
364+
and el.id_servico = d.id_servico
365+
and el.id_part = es.id_part
366+
left join especial.prorrogados p
367+
on p.ano = el.ano
368+
and p.id_servico = el.id_servico
369+
and p.id_part = el.id_part
370+
where es.id_usu is null -- possui resp
371+
and el.id_servico = <1>
372+
and el.id_part = <1>
373+
and (
374+
el.id_part in (8005, 8012)
375+
or
376+
d.liberada = <1>
377+
)
378+
and ((d.data_ini <= date(now()) and d.data_fim >= date(now()))
379+
or (
380+
d.data_ini_excecao <= date(now())
381+
and d.data_fim_excecao >= date(now())
382+
and p.id_part not in (
383+
select s.id_part from especial.solicitacao s
384+
where s.data < d.data_ini_excecao
385+
and s.id_part = el.id_part and s.ano = d.ano
386+
and s.id_servico = d.id_servico
387+
)
388+
)
389+
or (p.data_fim >= date(now()))
390+
)
391+
) as resultados_em_aberto';
392+
$traced = new TracedStatement($query, $params);
393+
$result = $traced->getSqlWithParams();
394+
$this->assertEquals($expected, $result);
395+
}
153396
}

0 commit comments

Comments
 (0)