public void CreateTable( string schemaName, string tableName, ColInfo cols, string definition, bool isView, bool alter, Exec e )
  {
    Schema schema = GetSchema( schemaName, true, e );

    bool isView1; string definition1;
    long tableId = tableId = ReadTableId( schema, tableName, out isView1, out definition1 );

    if ( alter ) 
    {
      if ( tableId == 0 || !isView1 ) e.Error( "View does not exist" );
    }
    else if ( Normal && schema.GetCachedTable( tableName ) != null || tableId >= 0 ) 
      e.Error( "Table/View " + schemaName + "." + tableName + " already exists" );

    var r = new RowCursor( SysTable );
    r.V[1].L = schema.Id;
    r.V[2].O = tableName;
    r.V[3].L = isView ? 1 : 0;
    r.V[4].O = isView ? definition.Trim() : "";

    if ( alter ) r.Update( tableId ); else tableId = r.Insert();

    if ( !isView) SaveColumns( tableId, cols );
    if ( isView ) ResetCache();
  }
  // Schema methods Create/Drop Schema, Table, View, Function, Procedure, Index etc.

  public void CreateSchema( string schemaName, Exec e )
  {
    if ( Normal && GetSchemaId( schemaName, false, e ) >= 0 ) 
      e.Error( "Schema already exists : " + schemaName );
    var r = new RowCursor( SysSchema );
    r.V[1].O = schemaName;
    r.Insert();
  }
 void SaveColumns( long tableId, ColInfo cols )
 {
   var r = new RowCursor( SysColumn );
   r.V[1].L = tableId;
   for ( int i = 0; i < cols.Count; i += 1 )
   {
     r.V[2].O = cols.Names[i];
     r.V[3].L = (long)cols.Types[i];
     r.Insert();
   }
 }
  // Indexes.

  public void CreateIndex( string schemaName, string tableName, string indexName, string [] names, Exec e )
  {
    Table t = (Table)GetTable( schemaName, tableName, e );
    long tid = t.TableId;

    long indexId = GetIndexId( tid, indexName );
    if ( indexId != 0 ) e.Error( "Index already exists" );

    int [] colIx = new int[ names.Length ];
    for ( int i=0; i < names.Length; i +=1 )
    {
      colIx[ i ] = t.ColumnIx( names[i], e );
    }    

    // Create the index.
    {
      var r = new RowCursor( SysIndex );
      r.V[1].L = tid;
      r.V[2].O = indexName;
      indexId = r.Insert();
    }
    // Create the index columns.
    {
      var r = new RowCursor( SysIndexCol );
      r.V[1].L = tid;
      r.V[2].L = indexId;
      for ( int i = 0; i < names.Length; i += 1 )
      {
        r.V[3].L = colIx[ i ];
        r.Insert();
      }
    }

    if ( Normal ) 
    {
      t.OpenIndexes();
      t.InitIndex( indexId );
    }
  }