0

I am using the Schema module (7.x-1.2) on Drupal 7.34. This is the code I am using for a module I created.

function myid_schema(){ $schema = array(); $schema['myid_templates'] = array( 'description' => 'TODO: please describe this table!', 'fields' => array( 'template_id' => array( 'description' => 'TODO: please describe this field!', 'type' => 'serial', 'not null' => TRUE, ), 'template_name' => array( 'description' => 'TODO: please describe this field!', 'type' => 'varchar', 'not null' => FALSE, ), 'portrait' => array( 'description' => 'TODO: please describe this field!', 'type' => 'boolean', 'not null' => TRUE, ), 'template_width' => array( 'description' => 'TODO: please describe this field!', 'type' => 'numeric', 'not null' => TRUE, 'default' => 0, 'precision' => 0, 'scale' => 0, ), 'template_height' => array( 'description' => 'TODO: please describe this field!', 'type' => 'numeric', 'not null' => TRUE, 'default' => 0, 'precision' => 0, 'scale' => 0, ), ), 'primary key' => array('template_id'), ); return $schema; } function myid_install() { drupal_install_schema('myid_templates'); } 

After installing the module, it throws this error.

Notice: Undefined index: boolean:normal in DatabaseSchema_pgsql->processField() (line 229 of C:\xampp\htdocs\drupal-7.34\includes\database\pgsql\schema.inc).

PDOException: SQLSTATE[42601]: Syntax error: 7 ERROR: syntax error at or near "NOT" LINE 4: portrait NOT NULL, ^: CREATE TABLE {myid_templates} ( template_id serial, template_name varchar NULL, portrait NOT NULL, template_width numeric(0, 0) NOT NULL default 0, template_height numeric(0, 0) NOT NULL default 0, PRIMARY KEY (template_id) ); Array ( ) in db_create_table() (line 2720 of C:\xampp\htdocs\drupal-7.34\includes\database\database.inc)

Why does it throw an error? How do I fix it?

1 Answer 1

1

Drupal doesn't have a boolean type for DB schema, and there's no automatic fallback for a type it doesn't know about, so you end up with the invalid portrait NOT NULL instead of portrait boolean NOT NULL in the create statement.

To fix, just add a pgsql_type to the column. DatabaseSchema_pgsql::processField() knows what to do with it.

'portrait' => array( 'description' => 'TODO: please describe this field!', 'type' => 'int', // Keep it portable 'pgsql_type' => 'boolean', 'not null' => TRUE, ),