查询过程前面解析类似insert,最终调用是在下面这个QuerySpecification类的getSingleResult方法,RangeVariable是查询条件相关
private Result getSingleResult(Session session, int maxRows) { int[] limits = sortAndSlice.getLimits(session, this, maxRows); Result r = buildResult(session, limits); RowSetNavigatorData navigator = (RowSetNavigatorData) r.getNavigator(); if (isDistinctSelect) { navigator.removeDuplicates(session); } if (sortAndSlice.hasOrder()) { navigator.sortOrder(session); } if (limits != SortAndSlice.defaultLimits && !sortAndSlice.skipFullResult) { navigator.trim(limits[0], limits[1]); } return r; } private Result buildResult(Session session, int[] limits) { RowSetNavigatorData navigator = new RowSetNavigatorData(session, (QuerySpecification) this); Result result = Result.newResult(navigator); result.metaData = resultMetaData; if (isUpdatable) { result.rsProperties = ResultProperties.updatablePropsValue; } int skipCount = 0; int limitCount = limits[2]; if (sortAndSlice.skipFullResult) { skipCount = limits[0]; limitCount = limits[1]; } if (this.isSimpleCount) { Object[] data = new Object[indexLimitData]; Table table = rangeVariables[0].getTable(); table.materialise(session); PersistentStore store = table.getRowStore(session); long count = store.elementCount(session); data[0] = data[indexStartAggregates] = ValuePool.getLong(count); navigator.add(data); return result; } int fullJoinIndex = 0; RangeIterator[] rangeIterators = new RangeIterator[rangeVariables.length]; for (int i = 0; i < rangeVariables.length; i++) { rangeIterators[i] = rangeVariables[i].getIterator(session); } session.sessionContext.rownum = 1; for (int currentIndex = 0; ; ) { if (currentIndex < fullJoinIndex) { // finished current span // or finished outer rows on right navigator boolean end = true; for (int i = fullJoinIndex + 1; i < rangeVariables.length; i++) { if (rangeVariables[i].isRightJoin) { fullJoinIndex = i; currentIndex = i; end = false; ((RangeIteratorRight) rangeIterators[i]) .setOnOuterRows(); break; } } if (end) { break; } } RangeIterator it = rangeIterators[currentIndex]; if (it.next()) { if (currentIndex < rangeVariables.length - 1) { currentIndex++; continue; } } else { it.reset(); currentIndex--; continue; } if (limitCount == 0) { break; } session.sessionData.startRowProcessing(); Object[] data = new Object[indexLimitData]; for (int i = 0; i < indexStartAggregates; i++) { if (isAggregated && aggregateCheck[i]) { continue; } else { data[i] = exprColumns[i].getValue(session); } } for (int i = indexLimitVisible; i < indexLimitRowId; i++) { if (i == indexLimitVisible) { data[i] = it.getRowidObject(); } else { data[i] = it.getCurrentRow(); } } session.sessionContext.rownum++; if (skipCount > 0) { skipCount--; continue; } Object[] groupData = null; if (isAggregated || isGrouped) { groupData = navigator.getGroupData(data); if (groupData != null) { data = groupData; } } for (int i = indexStartAggregates; i < indexLimitExpressions; i++) { data[i] = exprColumns[i].updateAggregatingValue(session, data[i]); } if (groupData == null) { navigator.add(data); } else if (isAggregated) { navigator.update(groupData, data); } int rowCount = navigator.getSize(); if (rowCount == session.resultMaxMemoryRows && !isAggregated && !isSingleMemoryTable) { navigator = new RowSetNavigatorDataTable(session, this, navigator); result.setNavigator(navigator); } if (isAggregated || isGrouped) { if (!sortAndSlice.isGenerated) { continue; } } if (rowCount >= limitCount) { break; } } navigator.reset(); for (int i = 0; i < rangeVariables.length; i++) { rangeIterators[i].reset(); } if (!isGrouped && !isAggregated) { return result; } if (isAggregated) { if (!isGrouped && navigator.getSize() == 0) { Object[] data = new Object[exprColumns.length]; for (int i = 0; i < indexStartAggregates; i++) { if (!aggregateCheck[i]) { data[i] = exprColumns[i].getValue(session); } } navigator.add(data); } navigator.reset(); session.sessionContext.setRangeIterator(navigator); while (navigator.next()) { Object[] data = navigator.getCurrent(); for (int i = indexStartAggregates; i < indexLimitExpressions; i++) { data[i] = exprColumns[i].getAggregatedValue(session, data[i]); } for (int i = 0; i < indexStartAggregates; i++) { if (aggregateCheck[i]) { data[i] = exprColumns[i].getValue(session); } } } session.sessionContext.unsetRangeIterator(navigator); } navigator.reset(); if (havingCondition != null) { while (navigator.hasNext()) { Object[] data = (Object[]) navigator.getNext(); if (!Boolean.TRUE.equals( data[indexLimitVisible + groupByColumnCount])) { navigator.remove(); } } navigator.reset(); } return result; }
比如一个like操作,
查询结果:
这个StatementQuery实在复杂,再慢慢搞懂吧
相关推荐
简单的创建两个例子,如何创建hsqldb,如何使用hsqldb查询数据等。
对hsqldb的缓存和表格建立,数据存储机制以及使用eclipse的调试步骤做了详尽的分析,有截图辅助
Oracle数据库移植到HsqlDB操作手册
hsqldb确实是个好东西,对于系统演示,开发等都很方便。
hsqldb的最新1.9.0版本,支持windows操作系统
HSQLDB 1.8.0
hsqldb 2 3 2 zip HyperSQL是用Java编写的一款SQL关系数据库引擎 它的核心完全是多线程的 支持双向锁和MVCC 多版本并发控制 几乎完整支持ANSI 92 SQL 支持常见数据类型 最新版本增加了对BLOB和CLOB数据的支持 最高...
src:HSQLDB数据库的最新源代码,在源代码中附加了轻松分析理解代码的注释 把代码引入Eclipse 运行mvn eclipse:eclipse生成Eclipse项目,打开Eclipse,选择File-> Import-> Existing Projects into Workspace 运行...
hsqldb jdbc driver适合于hsqldb
数据库连接 hsqldb1.7.1.jar
hsqldb jar
hsqldb for jdk1.5因为hsqldb的2.0版本以上都是jdk1.6进行编译的,我提供的这个2.25版本的是jdk1.5编译的。
HSQLDB中文手册
HSQLDB中文文档,能够提高数据的处理速度。
hsqldb可能需要的额外jar包 Additional Jar files needed for hsqldb.
HSQLDB数据库,经典啊
HyperSQL User Guide HyperSQL Database Engine (HSQLDB) 2.2 hsqldb-2.2.9用户手册
hsqldb-2.4.0
NULL 博文链接:https://songwensheng.iteye.com/blog/855119
hsqldb是我们进行Java开发的最常用的数据库之一,希望大家能够喜欢