Skip to content

Commit

Permalink
TEIID-3418 adding the ability to resolve positional group by for odbc
Browse files Browse the repository at this point in the history
  • Loading branch information
shawkins authored and jolee committed Jun 25, 2015
1 parent 776dedf commit 573c12b
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 8 deletions.
6 changes: 6 additions & 0 deletions build/kits/jboss-as7/docs/teiid/teiid-releasenotes.html
Original file line number Diff line number Diff line change
Expand Up @@ -311,6 +311,12 @@ <h2><a name="Other">Other Issues</a></h2>

<h4>from ${project.version}</h4>
<ul>
<li>[<a href='https://issues.jboss.org/browse/TEIID-3418'>TEIID-3418</a>] - Allow positional group by for odbc
</li>
</ul>

<h4>from 8.7.3</h4>
<ul>
<li>[<a href='https://issues.jboss.org/browse/TEIID-3271'>TEIID-3271</a>] - JDBC Translator | Incorrect Update count reported on Batched Update Execution
</li>
<li>[<a href='https://issues.jboss.org/browse/TEIID-3410'>TEIID-3410</a>] - OData object URI does not resolve to a usable URL.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
import org.teiid.core.TeiidException;
import org.teiid.core.TeiidRuntimeException;
import org.teiid.core.types.DataTypeManager;
import org.teiid.dqp.internal.process.DQPWorkContext;
import org.teiid.query.QueryPlugin;
import org.teiid.query.metadata.QueryMetadataInterface;
import org.teiid.query.metadata.StoredProcedureInfo;
Expand All @@ -47,6 +48,7 @@
import org.teiid.query.sql.navigator.PostOrderNavigator;
import org.teiid.query.sql.navigator.PreOrPostOrderNavigator;
import org.teiid.query.sql.symbol.*;
import org.teiid.query.sql.util.SymbolMap;
import org.teiid.query.sql.visitor.ElementCollectorVisitor;
import org.teiid.query.sql.visitor.ExpressionMappingVisitor;

Expand Down Expand Up @@ -210,7 +212,26 @@ public void visit(Query obj) {
visitNode(obj.getCriteria());
visitNode(obj.getGroupBy());
visitNode(obj.getHaving());
visitNode(obj.getSelect());
visitNode(obj.getSelect());
GroupBy groupBy = obj.getGroupBy();
if (groupBy != null) {
Object var = DQPWorkContext.getWorkContext().getSession().getSessionVariables().get("resolve_groupby_positional"); //$NON-NLS-1$
if (Boolean.TRUE.equals(var)) {
for (int i = 0; i < groupBy.getCount(); i++) {
List<Expression> select = obj.getSelect().getProjectedSymbols();
Expression ex = groupBy.getSymbols().get(i);
ex = SymbolMap.getExpression(ex);
if (ex instanceof Constant && ex.getType() == DataTypeManager.DefaultDataClasses.INTEGER) {
Integer val = (Integer) ((Constant)ex).getValue();
if (val != null && val > 0 && val <= select.size()) {
Expression selectExpression = select.get(val - 1);
selectExpression = SymbolMap.getExpression(selectExpression);
groupBy.getSymbols().set(i, (Expression) selectExpression.clone());
}
}
}
}
}
visitNode(obj.getLimit());
}

Expand Down
27 changes: 20 additions & 7 deletions runtime/src/main/java/org/teiid/odbc/ODBCServerRemoteImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,7 @@
*/
package org.teiid.odbc;

import static org.teiid.odbc.PGUtil.PG_TYPE_FLOAT4;
import static org.teiid.odbc.PGUtil.PG_TYPE_FLOAT8;
import static org.teiid.odbc.PGUtil.PG_TYPE_NUMERIC;
import static org.teiid.odbc.PGUtil.convertType;
import static org.teiid.odbc.PGUtil.*;

import java.io.IOException;
import java.net.InetSocketAddress;
Expand All @@ -33,7 +30,14 @@
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.ExecutionException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
Expand All @@ -48,15 +52,22 @@
import org.teiid.core.util.StringUtil;
import org.teiid.deployers.PgCatalogMetadataStore;
import org.teiid.dqp.service.SessionService;
import org.teiid.jdbc.*;
import org.teiid.jdbc.ConnectionImpl;
import org.teiid.jdbc.PreparedStatementImpl;
import org.teiid.jdbc.ResultSetImpl;
import org.teiid.jdbc.StatementImpl;
import org.teiid.jdbc.TeiidDriver;
import org.teiid.logging.LogConstants;
import org.teiid.logging.LogManager;
import org.teiid.net.socket.AuthenticationType;
import org.teiid.net.socket.SocketServerConnection;
import org.teiid.odbc.PGUtil.PgColInfo;
import org.teiid.query.parser.SQLParserUtil;
import org.teiid.runtime.RuntimePlugin;
import org.teiid.transport.*;
import org.teiid.transport.LocalServerConnection;
import org.teiid.transport.LogonImpl;
import org.teiid.transport.ODBCClientInstance;
import org.teiid.transport.PgBackendProtocol;
import org.teiid.transport.PgFrontendProtocol.NullTerminatedStringDataInputStream;

/**
Expand Down Expand Up @@ -259,6 +270,8 @@ else if (authType.equals(AuthenticationType.GSS)) {
String key = (String)keys.nextElement();
this.connection.setExecutionProperty(key, this.props.getProperty(key));
}
StatementImpl s = this.connection.createStatement();
s.execute("select teiid_session_set('resolve_groupby_positional', true)"); //$NON-NLS-1$
this.client.authenticationSucess(hash, hash);
ready();
} catch (SQLException e) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -572,5 +572,11 @@ private void connect(String database) throws SQLException {
assertTrue(s.execute("select * from tables order by name"));
conn.setAutoCommit(true);
}

@Test public void testGropuByPositional() throws Exception {
Statement s = conn.createStatement();
//would normally throw an exception, but is allowable over odbc
s.execute("select name, count(schemaname) from tables group by 1");
}

}

0 comments on commit 573c12b

Please sign in to comment.