public ResultInfo(Identifier tableAliasName, Identifier columnAliasName, TableAndColumn source) { this.TableAliasName = tableAliasName; this.ColumnAliasName = columnAliasName; this.Sources = new List <TableAndColumn>() { source }; }
// これらサブクエリ内で親クエリの抽出元テーブルへの一致条件がある場合 // ・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 }
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(); } } }
// 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); } }