protected static PhoenixConnection addMetaDataColumn( PhoenixConnection conn, long scn, String columnDef) throws SQLException { PhoenixConnection metaConnection = null; Statement stmt = null; try { metaConnection = new PhoenixConnection(conn.getQueryServices(), conn, scn); try { stmt = metaConnection.createStatement(); stmt.executeUpdate("ALTER TABLE SYSTEM.\"TABLE\" ADD IF NOT EXISTS " + columnDef); return metaConnection; } finally { if (stmt != null) { stmt.close(); } } } finally { if (metaConnection != null) { metaConnection.close(); } } }
// TODO: share this with ConnectionQueryServicesImpl @Override public void init(String url, Properties props) throws SQLException { if (initialized) { if (initializationException != null) { throw initializationException; } return; } synchronized (this) { if (initialized) { if (initializationException != null) { throw initializationException; } return; } SQLException sqlE = null; PhoenixConnection metaConnection = null; try { Properties scnProps = PropertiesUtil.deepCopy(props); scnProps.setProperty( PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(MetaDataProtocol.MIN_SYSTEM_TABLE_TIMESTAMP)); scnProps.remove(PhoenixRuntime.TENANT_ID_ATTRIB); String globalUrl = JDBCUtil.removeProperty(url, PhoenixRuntime.TENANT_ID_ATTRIB); metaConnection = new PhoenixConnection(this, globalUrl, scnProps, newEmptyMetaData()); try { metaConnection.createStatement().executeUpdate(QueryConstants.CREATE_TABLE_METADATA); } catch (TableAlreadyExistsException ignore) { // Ignore, as this will happen if the SYSTEM.TABLE already exists at this fixed timestamp. // A TableAlreadyExistsException is not thrown, since the table only exists *after* this // fixed timestamp. } try { int nSaltBuckets = getSequenceSaltBuckets(); String createTableStatement = Sequence.getCreateTableStatement(nSaltBuckets); metaConnection.createStatement().executeUpdate(createTableStatement); } catch (NewerTableAlreadyExistsException ignore) { // Ignore, as this will happen if the SYSTEM.SEQUENCE already exists at this fixed // timestamp. // A TableAlreadyExistsException is not thrown, since the table only exists *after* this // fixed timestamp. } try { metaConnection .createStatement() .executeUpdate(QueryConstants.CREATE_STATS_TABLE_METADATA); } catch (NewerTableAlreadyExistsException ignore) { // Ignore, as this will happen if the SYSTEM.SEQUENCE already exists at this fixed // timestamp. // A TableAlreadyExistsException is not thrown, since the table only exists *after* this // fixed timestamp. } try { metaConnection.createStatement().executeUpdate(QueryConstants.CREATE_FUNCTION_METADATA); } catch (NewerTableAlreadyExistsException ignore) { } } catch (SQLException e) { sqlE = e; } finally { try { if (metaConnection != null) metaConnection.close(); } catch (SQLException e) { if (sqlE != null) { sqlE.setNextException(e); } else { sqlE = e; } } finally { try { if (sqlE != null) { initializationException = sqlE; throw sqlE; } } finally { initialized = true; } } } } }