1 24 25 package com.mckoi.database.interpret; 26 27 import com.mckoi.database.*; 28 import com.mckoi.debug.*; 29 import com.mckoi.util.IntegerVector; 30 import java.util.Set ; 31 import java.util.List ; 32 import java.util.Vector ; 33 import java.util.Iterator ; 34 import java.util.ArrayList ; 35 import java.util.Collections ; 36 37 42 43 public class Select extends Statement { 44 45 48 private TableSelectExpression select_expression; 49 50 53 private ArrayList order_by; 54 55 58 private Variable[] order_cols; 59 60 63 private QueryPlanNode plan; 64 65 66 67 73 static final void checkUserSelectPermissions( 74 DatabaseQueryContext context, User user, QueryPlanNode plan) 75 throws UserAccessException, DatabaseException { 76 77 ArrayList touched_tables = plan.discoverTableNames(new ArrayList ()); 79 Database dbase = context.getDatabase(); 80 for (int i = 0; i < touched_tables.size(); ++i) { 82 TableName t = (TableName) touched_tables.get(i); 83 if (!dbase.canUserSelectFromTableObject(context, user, t, null)) { 84 throw new UserAccessException( 85 "User not permitted to select from table: " + t); 86 } 87 } 88 } 89 90 108 public void prepare() throws DatabaseException { 109 DatabaseConnection db = database; 110 111 select_expression = 114 (TableSelectExpression) cmd.getObject("table_expression"); 115 order_by = (ArrayList ) cmd.getObject("order_by"); 117 118 TableExpressionFromSet from_set = 120 Planner.generateFromSet(select_expression, db); 121 122 plan = Planner.formQueryPlan(db, select_expression, from_set, order_by); 124 125 } 126 127 128 131 public Table evaluate() throws DatabaseException { 132 133 DatabaseQueryContext context = new DatabaseQueryContext(database); 134 135 checkUserSelectPermissions(context, user, plan); 138 139 boolean error = true; 140 try { 141 Table t = plan.evaluate(context); 142 error = false; 143 return t; 144 } 145 finally { 146 if (Debug().isInterestedIn(Lvl.INFORMATION) || 149 (error && Debug().isInterestedIn(Lvl.WARNING))) { 150 StringBuffer buf = new StringBuffer (); 151 plan.debugString(0, buf); 152 153 Debug().write(Lvl.WARNING, this, 154 "Query Plan debug:\n" + 155 buf.toString()); 156 } 157 } 158 159 } 160 161 162 165 public String toString() { 166 StringBuffer buf = new StringBuffer (); 167 buf.append("[ SELECT: expression="); 168 buf.append(select_expression.toString()); 169 buf.append(" ORDER_BY="); 170 buf.append(order_by); 171 buf.append(" ]"); 172 return new String (buf); 173 } 174 175 } 176 | Popular Tags |