public ResultInfo(Identifier tableAliasName, Identifier columnAliasName, TableAndColumn source)
 {
     this.TableAliasName  = tableAliasName;
     this.ColumnAliasName = columnAliasName;
     this.Sources         = new List <TableAndColumn>()
     {
         source
     };
 }
示例#2
0
            // これらサブクエリ内で親クエリの抽出元テーブルへの一致条件がある場合
            // ・SELECT句サブクエリの場合
            //   サブクエリへの抽出条件になるが、親クエリへの抽出条件にはならない
            // ・EXISTS句サブクエリの場合
            //   サブクエリへの抽出条件にならず、親クエリへの抽出条件になる
            // の二通りの解釈が必要になる。そのため以下の仕様とする。

            //・結合条件のための一致条件では双方向の演算とする
            //  select * from T join U
            //  where T.x = U.x
            //  ----------------------
            //  T.x <- U.x
            //  U.x <- T.x
            //
            //・SELECT句サブクエリの抽出元テーブル方向への一致条件のみとする
            //  select
            //    (select x from U
            //     where U.x = T.x)
            //  from T
            //  -------------------
            //  U.x <- T.x
            //
            //・EXIST句の親クエリの抽出元テーブル方向への一致条件のみとする
            //  select * from T
            //  where exists (select * from U
            //                where U.x = T.x)
            //  ------------------------------
            //  T.x <- U.x
            //
            //・サブクエリの抽出元テーブルが被演算子になっていない一致条件は無視する
            //  (サブクエリに親テーブルのみの一致条件が記述されることはあまりない上に
            //   実装はやや手間取るためこの仕様とする)
            //  select * from T
            //  where exists (select * from U
            //                where exists (select * from V
            //                              where T.x = 1    <= 無視する
            //                                and U.x = T.x) <= 無視する
            //               )

            // tableColumn <- literal
            public void Add(TableAndColumn tableColumn, Literal literal)
            {
                //if(_halfEqualitiesToLiteral.ContainsKey(tableColumn.Table, tableColumn.ColumnName)) {
                //  if(_halfEqualitiesToLiteral[tableColumn.Table, tableColumn.ColumnName] == literal) {

                var tableKeyExists = _halfEqualitiesToLiteral.ContainsKey(tableColumn.Table);

                if (tableKeyExists &&
                    _halfEqualitiesToLiteral[tableColumn.Table].ContainsKey(tableColumn.ColumnName))
                {
                    if (_halfEqualitiesToLiteral[tableColumn.Table][tableColumn.ColumnName] == literal)
                    {
                        // 同じ一致条件は重複して登録しない
                    }
                    else
                    {
                        // 同じDB列に異なる値への一致条件が存在する場合、対象テーブルからの抽出件数は0件である
                        // 従って対象テーブルのエントリ自体を削除する
                        _halfEqualitiesToLiteral.Remove(tableColumn.Table);
                    }
                }
                else
                {
                    // 半等式の推移律を適用して、(列B <- 列A , 列A <- 1) ⇒ (列B <- 1 , 列A <- 1) に変換する

                    // (列A <- 1)を登録する
                    _noEqualityTables.Remove(tableColumn.Table);
                    //_halfEqualitiesToLiteral.Add(tableColumn.Table, tableColumn.ColumnName, literal);
                    if (tableKeyExists)
                    {
                        _halfEqualitiesToLiteral[tableColumn.Table].Add(tableColumn.ColumnName, literal);
                    }
                    else
                    {
                        _halfEqualitiesToLiteral.Add(
                            tableColumn.Table
                            , new Dictionary <string, Literal>()
                        {
                            { tableColumn.ColumnName, literal }
                        });
                    }

                    foreach (var halfEquality in _halfEqualities)
                    {
                        if (halfEquality.Item2 == tableColumn)
                        {
                            // (列B <- 1)を登録する
                            this.Add(halfEquality.Item1, literal);
                        }
                    } // foreach
                }     // if
            }
示例#3
0
        public override void VisitOnValues(InsertValuesStmt insertValuesStmt, int offset)
        {
            var table = insertValuesStmt.Table;

            if (insertValuesStmt.HasTableColumns)
            {
                for (int i = 0; i < insertValuesStmt.ValuesList.Count; ++i)
                {
                    foreach (var assignment in insertValuesStmt.GetAssignments(i))
                    {
                        var columnName = assignment.Column.Name;
                        if (assignment.Value.IsDefault)
                        {
                        }
                        else if (assignment.Value is Literal)
                        {
                            var tableColumn = new TableAndColumn(table, columnName);
                            _cnfSet.Add(tableColumn, (Literal)assignment.Value);
                        }
                    }
                    table = table.Clone();
                }
            }
            else if (_tableColumns.ContainsKey(table.Name))
            {
                // テーブル列名がCREATE文の定義順に格納されていることが前提である
                foreach (var values in insertValuesStmt.ValuesList)
                {
                    int columnIndex = 0;
                    foreach (var columnName in _tableColumns[table.Name])
                    {
                        var value = values[columnIndex];
                        if (value.IsDefault)
                        {
                        }
                        else if (value is Literal)
                        {
                            var tableColumn = new TableAndColumn(table, columnName);
                            _cnfSet.Add(tableColumn, (Literal)value);
                        }
                        ++columnIndex;
                    }
                    table = table.Clone();
                }
            }
        }
示例#4
0
            // lTableColumn <- rTableColumn
            public void Add(TableAndColumn lTableColumn, TableAndColumn rTableColumn)
            {
                // (列B <- 列A)を登録する
                var halfEquality = Tuple.Create(lTableColumn, rTableColumn);

                if (!_halfEqualities.Contains(halfEquality))
                {
                    _halfEqualities.Add(halfEquality);
                }
                // (列A <- 1)があれば(列B <- 1)を登録する
                //if(_halfEqualitiesToLiteral.ContainsKey(rTableColumn.Table, rTableColumn.ColumnName)) {
                //  var literal = _halfEqualitiesToLiteral[rTableColumn.Table, rTableColumn.ColumnName];
                //  this.Add(lTableColumn, literal);
                //}
                if (_halfEqualitiesToLiteral.ContainsKey(rTableColumn.Table) &&
                    _halfEqualitiesToLiteral[rTableColumn.Table].ContainsKey(rTableColumn.ColumnName))
                {
                    var literal = _halfEqualitiesToLiteral[rTableColumn.Table][rTableColumn.ColumnName];
                    this.Add(lTableColumn, literal);
                }
            }