/**
  * Parses CREATE INDEX command.
  *
  * @param database database
  * @param command CREATE INDEX command
  */
 public static function parse($database, $command)
 {
     if (preg_match(self::CREATE_PATTERN, trim($command), $matches) > 0) {
         $unique_value = strlen(trim($matches[1])) > 0 ? 'true' : 'false';
         $index_name = $matches[2];
         $table_name = $matches[3];
         $using = trim($matches[4]);
         if ($index_name == null || $table_name == null || $using == null) {
             throw new exception("Cannot parse command: " . $command);
         }
         $node_schema =& dbx::get_schema($database, sql_parser::get_schema_name(trim($table_name), $database));
         $node_table =& dbx::get_table($node_schema, sql_parser::get_object_name(trim($table_name)));
         if ($node_table == null) {
             throw new exception("Failed to find table: " . $table_name);
         }
         $node_index =& dbx::create_table_index($node_table, $index_name);
         dbx::set_attribute($node_index, 'using', $using);
         dbx::set_attribute($node_index, 'unique', $unique_value);
     } else {
         throw new exception("Cannot parse command: " . $command);
     }
 }
 /**
  * Parses all rows in CREATE TABLE command.
  *
  * @param $node_schema   schema table belongs to
  * @param $node_table    table being parsed
  * @param $command  command without 'CREATE TABLE ... (' string
  */
 private static function parse_rows(&$node_schema, &$node_table, $command)
 {
     $line = $command;
     $post_columns = false;
     while (strlen($line) > 0) {
         $command_end = sql_parser::get_command_end($line, 0);
         $subCommand = trim(substr($line, 0, $command_end));
         if ($post_columns) {
             $line = self::parse_post_columns($node_table, $subCommand);
             break;
         } else {
             if (substr($line, $command_end, 1) == ')') {
                 $post_columns = true;
             }
         }
         // look for modifier tokens and act accordingly
         $tokens = preg_split("/[\\s]+/", $subCommand, -1, PREG_SPLIT_NO_EMPTY);
         // start at 2, first is always name, second is always type
         for ($i = 2; $i < count($tokens); $i++) {
             if (strcasecmp($tokens[$i], 'UNIQUE') == 0) {
                 // CREATE TABLE test_table (
                 //   test_table_id varchar(64) PRIMARY KEY,
                 //   test_table_col_c varchar(100) UNIQUE NOT NULL
                 // );
                 // NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "test_table_pkey" for table "test_table"
                 // NOTICE:  CREATE TABLE / UNIQUE will create implicit index "test_table_test_table_col_c_key" for table "test_table"
                 dbsteward::debug("NOTICE:  CREATE TABLE with UNIQUE column attribute -- creating implicit index \"" . pgsql8_index::index_name(sql_parser::get_object_name($node_table->get_name()), sql_parser::get_object_name($tokens[0]), 'key') . "\" for table \"" . $node_schema->get_name() . '.' . $node_table->get_name() . "\"");
                 $node_index =& dbx::create_table_index($node_table, pgsql8_index::index_name(sql_parser::get_object_name($node_table['name']), sql_parser::get_object_name($tokens[0]), 'key'));
                 dbx::set_attribute($node_index, 'unique', 'true');
                 dbx::set_attribute($node_index, 'using', 'btree');
                 $node_index->addChild('indexDimension', sql_parser::get_object_name($tokens[0]))->addAttribute('name', $tokens[0] . '_unq');
                 // make sure we don't process this token again
                 unset($tokens[$i]);
                 $tokens = array_merge($tokens);
                 $i--;
                 continue;
             }
             // @TODO: other cases?
             // other cases is how you would fix pgsql8_column::parse_definition() throwing 'column definition parse fail' exceptions
         }
         $subCommand = implode(' ', $tokens);
         self::parse_column_defs($node_schema, $node_table, $subCommand);
         $line = $command_end >= strlen($line) ? "" : substr($line, $command_end + 1);
     }
     $line = trim($line);
     if (strlen($line) > 0) {
         throw new exception("Cannot parse CREATE TABLE '" . $node_table['name'] . "' - do not know how to parse '" . $line . "'");
     }
 }