Skip to content

Commit f1540e1

Browse files
authored
Merge pull request #94 from andrex47/master
query string refatoration
2 parents 23f5020 + f320214 commit f1540e1

File tree

2 files changed

+44
-66
lines changed

2 files changed

+44
-66
lines changed

src/Database/Connection.php

+24-47
Original file line numberDiff line numberDiff line change
@@ -264,55 +264,32 @@ private function queryString($tables)
264264
// Has domain.table
265265
if (isset($explicitDB[1])) {
266266
return <<<SQL
267-
SELECT
268-
a.name,
269-
st.name AS type
270-
FROM
271-
{$explicitDB[0]}..syscolumns a,
272-
{$explicitDB[0]}..systypes b,
273-
{$explicitDB[0]}..systypes s,
274-
{$explicitDB[0]}..systypes st
275-
WHERE
276-
a.usertype = b.usertype AND
277-
s.usertype = a.usertype AND
278-
s.type = st.type AND
279-
st.name NOT IN (
280-
'timestamp',
281-
'sysname',
282-
'longsysname',
283-
'nchar',
284-
'nvarchar'
285-
) AND
286-
st.usertype < 100 AND
287-
object_name (
288-
a.id,
289-
db_id ('{$explicitDB[0]}')
290-
) = '{$explicitDB[1]}'
291-
SQL;
267+
SELECT
268+
syscolumns.name,
269+
systypes.name AS type
270+
FROM
271+
{$explicitDB[0]}..syscolumns noholdlock
272+
JOIN
273+
{$explicitDB[0]}..systypes noholdlock ON systypes.usertype = syscolumns.usertype
274+
WHERE
275+
systypes.name NOT IN ('timestamp', 'sysname', 'longsysname', 'nchar', 'nvarchar')
276+
AND systypes.usertype < 100
277+
AND object_name(syscolumns.id, db_id('{$explicitDB[0]}')) = '{$explicitDB[1]}'
278+
SQL;
292279
} else {
293280
return <<<SQL
294-
SELECT
295-
a.name,
296-
st.name AS type
297-
FROM
298-
syscolumns a,
299-
systypes b,
300-
systypes s,
301-
systypes st
302-
WHERE
303-
a.usertype = b.usertype AND
304-
s.usertype = a.usertype AND
305-
s.type = st.type AND
306-
st.name NOT IN (
307-
'timestamp',
308-
'sysname',
309-
'longsysname',
310-
'nchar',
311-
'nvarchar'
312-
) AND
313-
st.usertype < 100 AND
314-
object_name (a.id) = '{$tables}'
315-
SQL;
281+
SELECT
282+
syscolumns.name,
283+
systypes.name AS type
284+
FROM
285+
syscolumns
286+
JOIN
287+
systypes ON systypes.usertype = syscolumns.usertype
288+
WHERE
289+
systypes.name NOT IN ('timestamp', 'sysname', 'longsysname', 'nchar', 'nvarchar')
290+
AND systypes.usertype < 100
291+
AND object_name(syscolumns.id) = '{$tables}'
292+
SQL;
316293
}
317294
}
318295

src/Database/Schema/Grammar.php

+20-19
Original file line numberDiff line numberDiff line change
@@ -48,17 +48,18 @@ public function compileTableExists()
4848
public function compileColumnExists(string $table)
4949
{
5050
return "
51-
SELECT
52-
col.name
53-
FROM
54-
sys.columns AS col
55-
JOIN
56-
sys.objects AS obj
57-
ON
58-
col.object_id = obj.object_id
59-
WHERE
60-
obj.type = 'U' AND
61-
obj.name = '$table'";
51+
SELECT
52+
col.name
53+
FROM
54+
syscolumns col noholdlock
55+
JOIN
56+
sysobjects obj noholdlock
57+
ON
58+
col.id = obj.id
59+
WHERE
60+
obj.type = 'U' AND
61+
obj.name = '$table';
62+
";
6263
}
6364

6465
/**
@@ -112,15 +113,15 @@ public function compileColumns($table)
112113
NULL AS collation, -- Sybase não fornece suporte direto para collation em colunas
113114
com.text AS comment -- Comentários associados à coluna, se existirem
114115
FROM
115-
sysobjects obj
116+
sysobjects obj noholdlock
116117
JOIN
117-
syscolumns col ON obj.id = col.id
118+
syscolumns col noholdlock ON obj.id = col.id
118119
JOIN
119-
systypes type ON col.usertype = type.usertype
120+
systypes type noholdlock ON col.usertype = type.usertype
120121
LEFT JOIN
121-
syscomments def ON col.cdefault = def.id -- Valores padrão da coluna
122+
syscomments def noholdlock ON col.cdefault = def.id -- Valores padrão da coluna
122123
LEFT JOIN
123-
syscomments com ON col.colid = com.colid -- Comentários associados às colunas (se habilitados)
124+
syscomments com noholdlock ON col.colid = com.colid -- Comentários associados às colunas (se habilitados)
124125
WHERE
125126
obj.type IN ('U', 'V') -- 'U' para tabelas, 'V' para visões
126127
AND obj.name = '$table'
@@ -142,9 +143,9 @@ public function compileIndexes($table)
142143
CASE WHEN i.status & 2048 = 2048 THEN 'YES' ELSE 'NO' END AS is_primary,
143144
CASE WHEN i.status & 2 = 2 THEN 'YES' ELSE 'NO' END AS is_unique
144145
FROM
145-
sysobjects o
146-
INNER JOIN sysindexes i ON i.id = o.id
147-
INNER JOIN syscolumns c ON c.id = o.id
146+
sysobjects o noholdlock
147+
INNER JOIN sysindexes i noholdlock ON i.id = o.id
148+
INNER JOIN syscolumns c noholdlock ON c.id = o.id
148149
WHERE
149150
o.type = 'U' -- Apenas tabelas de usuário
150151
AND o.name = '$table' -- Nome da tabela alvo

0 commit comments

Comments
 (0)