2 merge requests!7452Issue #1797438. HTML5 validation is preventing form submit and not fully...,!789Issue #3210310: Adjust Database API to remove deprecated Drupal 9 code in Drupal 10
@@ -38,6 +38,13 @@ class Schema extends DatabaseSchema {
*/
protected$maxIdentifierLength;
/**
* PostgreSQL's temporary namespace name.
*
* @var string
*/
protected$tempNamespaceName;
/**
* Make sure to limit identifiers according to PostgreSQL compiled in length.
*
...
...
@@ -97,38 +104,36 @@ public function queryTableInformation($table) {
$key='public.'.$key;
}
else{
$schema=$this->connection->query('SELECT nspname FROM pg_namespace WHERE oid = pg_my_temp_schema()')->fetchField();
$key=$schema.'.'.$key;
$key=$this->getTempNamespaceName().'.'.$key;
}
if(!isset($this->tableInformation[$key])){
// Split the key into schema and table for querying.
list($schema,$table_name)=explode('.',$key);
$table_information=(object)array(
'blob_fields'=>array(),
'sequences'=>array(),
);
// Don't use {} around information_schema.columns table.
$this->connection->addSavepoint();
try{
// Check if the table information exists in the PostgreSQL metadata.
$table_information_exists=(bool)$this->connection->query("SELECT 1 FROM pg_class WHERE relname = :table",array(':table'=>$table_name))->fetchField();
// If the table information does not yet exist in the PostgreSQL
// metadata, then return the default table information here, so that it
// will not be cached.
if(!$table_information_exists){
$this->connection->releaseSavepoint();
return$table_information;
}
else{
$result=$this->connection->query("SELECT column_name, data_type, column_default FROM information_schema.columns WHERE table_schema = :schema AND table_name = :table AND (data_type = 'bytea' OR (numeric_precision IS NOT NULL AND column_default LIKE :default))",array(
':schema'=>$schema,
':table'=>$table_name,
':default'=>'%nextval%',
));
}
// The bytea columns and sequences for a table can be found in
// pg_attribute, which is significantly faster than querying the
// information_schema. The data type of a field can be found by lookup
// of the attribute ID, and the default value must be extracted from the
// node tree for the attribute definition instead of the historical
// human-readable column, adsrc.
$sql=<<<'EOD'
SELECT pg_attribute.attname AS column_name, format_type(pg_attribute.atttypid, pg_attribute.atttypmod) AS data_type, pg_get_expr(pg_attrdef.adbin, pg_attribute.attrelid) AS column_default
FROM pg_attribute
LEFT JOIN pg_attrdef ON pg_attrdef.adrelid = pg_attribute.attrelid AND pg_attrdef.adnum = pg_attribute.attnum
WHERE pg_attribute.attnum > 0
AND NOT pg_attribute.attisdropped
AND pg_attribute.attrelid = :key::regclass
AND (format_type(pg_attribute.atttypid, pg_attribute.atttypmod) = 'bytea'
OR pg_attrdef.adsrc LIKE 'nextval%')
EOD;
$result=$this->connection->query($sql,[
':key'=>$key,
]);
}
catch(\Exception$e){
$this->connection->rollbackSavepoint();
...
...
@@ -136,6 +141,13 @@ public function queryTableInformation($table) {
}
$this->connection->releaseSavepoint();
// If the table information does not yet exist in the PostgreSQL
// metadata, then return the default table information here, so that it