/** * Create a temporary view out of the given query. * * @param session the session * @param owner the owner of the query * @param name the view name * @param query the query * @param topQuery the top level query * @return the view table */ public static TableView createTempView(Session session, User owner, String name, Query query, Query topQuery) { Schema mainSchema = session.getDatabase().getSchema(Constants.SCHEMA_MAIN); String querySQL = query.getPlanSQL(); TableView v = new TableView(mainSchema, 0, name, querySQL, query.getParameters(), null, session, false); if (v.createException != null) { throw v.createException; } v.setTopQuery(topQuery); v.setOwner(owner); v.setTemporary(true); return v; }
@Override public PlanItem getBestPlanItem(Session session, int[] masks, TableFilter filter) { PlanItem item = new PlanItem(); Query q = getCachedQuery(session, masks); item.cost = q.getCost(); return item; }
private Query getCachedQuery(Session session, int[] masks) { final CacheKey cacheKey = new CacheKey(masks, session); synchronized (this) { Query q = queryCache.get(cacheKey); if (q == null) { q = getQuery(session, masks); queryCache.put(cacheKey, q); } return q; } }
public ViewCursor getViewCursor(Session session, TableFilter filter) { int len = getColumns().length; int[] masks = new int[len]; ArrayList<IndexCondition> indexConditions = filter.getIndexConditions(); Query q = getCachedQuery(session, masks); ArrayList<Parameter> paramList = q.getParameters(); ArrayList<Parameter> originalParameters = viewQuery.getParameters(); int idx = orig.getIndex(); Value value = orig.getValue(session); setParameter(paramList, idx, value); idx += getParameterOffset(); for (IndexCondition condition : indexConditions) { int id = condition.getColumn().getColumnId(); Value value = condition.getCurrentValue(session); if ((mask & IndexCondition.EQUALITY) != 0) { setParameter(paramList, idx++, value); setParameter(paramList, idx++, value); setParameter(paramList, idx++, value);
if (!tv.isTableExpression()) { throw DbException.get(ErrorCode.TABLE_OR_VIEW_ALREADY_EXISTS_1, tempViewName); TableView view = new TableView(schema, id, tempViewName, querySQL, null, cols, session, true); view.setTableExpression(true); view.setTemporary(true); session.addLocalTempTable(view); Query q = parseSelect();
@Override public boolean next() { while (true) { boolean res = result.next(); if (!res) { if (view.isRecursive()) { result.reset(); } else { result.close(); } current = null; return false; } current = view.getTemplateRow(); Value[] values = result.currentRow(); for (int i = 0, len = current.getColumnCount(); i < len; i++) { Value v = i < values.length ? values[i] : ValueNull.INSTANCE; current.setValue(i, v); } return true; } }
private void initColumnsAndTables(Session session) { Column[] cols; try { Query query = compileViewQuery(session, querySQL); this.querySQL = query.getSQL(); tables = New.arrayList(query.getTables()); setColumns(cols);
private Cursor find(TableView tableView) { return tableView.getViewCursor(session, tableFilter); }
firstIndexParam += getParameterOffset(); IntArray paramIndex = new IntArray(); for (int i = 0; i < masks.length; i++) {
Session s = session; alias = session.getNextSystemIdentifier(sqlCommand); table = TableView.createTempView(s, session.getUser(), alias, query, currentSelect); } else {