| /* Copyright (c) 2001-2010, The HSQL Development Group |
| * All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions are met: |
| * |
| * Redistributions of source code must retain the above copyright notice, this |
| * list of conditions and the following disclaimer. |
| * |
| * Redistributions in binary form must reproduce the above copyright notice, |
| * this list of conditions and the following disclaimer in the documentation |
| * and/or other materials provided with the distribution. |
| * |
| * Neither the name of the HSQL Development Group nor the names of its |
| * contributors may be used to endorse or promote products derived from this |
| * software without specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
| * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, |
| * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
| * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
| * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| */ |
| |
| |
| package org.hsqldb; |
| |
| import org.hsqldb.HsqlNameManager.HsqlName; |
| import org.hsqldb.error.Error; |
| import org.hsqldb.error.ErrorCode; |
| import org.hsqldb.types.CharacterType; |
| import org.hsqldb.types.Charset; |
| import org.hsqldb.types.DateTimeType; |
| import org.hsqldb.types.NumberType; |
| import org.hsqldb.types.Type; |
| import org.hsqldb.types.Types; |
| import org.hsqldb.types.UserTypeModifier; |
| |
| /** |
| * Invariant schema objects. |
| * |
| * @author Fred Toussi (fredt@users dot sourceforge.net) |
| * @version 1.9.0 |
| * @since 1.9.0 |
| */ |
| public class SqlInvariants { |
| |
| /** |
| * The role name reserved for authorization of INFORMATION_SCHEMA and |
| * system objects. |
| */ |
| public static final String SYSTEM_AUTHORIZATION_NAME = "_SYSTEM"; |
| |
| /** The role name reserved for ADMIN users. */ |
| public static final String DBA_ADMIN_ROLE_NAME = "DBA"; |
| |
| /** The role name allowing schema creation for users. */ |
| public static final String SCHEMA_CREATE_ROLE_NAME = "CREATE_SCHEMA"; |
| |
| /** The role name allowing switching authorisation for users. */ |
| public static final String CHANGE_AUTH_ROLE_NAME = "CHANGE_AUTHORIZATION"; |
| |
| // |
| public static final String SYSTEM_SUBQUERY = "SYSTEM_SUBQUERY"; |
| |
| /** The role name reserved for the special PUBLIC pseudo-user. */ |
| public static final String PUBLIC_ROLE_NAME = "PUBLIC"; |
| public static final String SYSTEM_SCHEMA = "SYSTEM_SCHEMA"; |
| public static final String LOBS_SCHEMA = "SYSTEM_LOBS"; |
| public static final String DEFINITION_SCHEMA = "DEFINITION_SCHEMA"; |
| public static final String INFORMATION_SCHEMA = "INFORMATION_SCHEMA"; |
| public static final String SQLJ_SCHEMA = "SQLJ"; |
| public static final String PUBLIC_SCHEMA = "PUBLIC"; |
| public static final String CLASSPATH_NAME = "CLASSPATH"; |
| public static final String MODULE = "MODULE"; |
| public static final HsqlName INFORMATION_SCHEMA_HSQLNAME; |
| public static final HsqlName SYSTEM_SCHEMA_HSQLNAME; |
| public static final HsqlName LOBS_SCHEMA_HSQLNAME; |
| public static final HsqlName SQLJ_SCHEMA_HSQLNAME; |
| public static final HsqlName SYSTEM_SUBQUERY_HSQLNAME; |
| public static final HsqlName MODULE_HSQLNAME; |
| |
| static { |
| INFORMATION_SCHEMA_HSQLNAME = |
| HsqlNameManager.newSystemObjectName(INFORMATION_SCHEMA, |
| SchemaObject.SCHEMA); |
| SYSTEM_SCHEMA_HSQLNAME = |
| HsqlNameManager.newSystemObjectName(SYSTEM_SCHEMA, |
| SchemaObject.SCHEMA); |
| LOBS_SCHEMA_HSQLNAME = HsqlNameManager.newSystemObjectName(LOBS_SCHEMA, |
| SchemaObject.SCHEMA); |
| SQLJ_SCHEMA_HSQLNAME = HsqlNameManager.newSystemObjectName(SQLJ_SCHEMA, |
| SchemaObject.SCHEMA); |
| SYSTEM_SUBQUERY_HSQLNAME = |
| HsqlNameManager.newSystemObjectName(SYSTEM_SUBQUERY, |
| SchemaObject.TABLE); |
| MODULE_HSQLNAME = |
| HsqlNameManager.newSystemObjectName(MODULE, SchemaObject.SCHEMA); |
| |
| SYSTEM_SUBQUERY_HSQLNAME.setSchemaIfNull(SYSTEM_SCHEMA_HSQLNAME); |
| } |
| |
| public static final Charset SQL_TEXT; |
| public static final Charset SQL_IDENTIFIER_CHARSET; |
| public static final Charset SQL_CHARACTER; |
| public static final Charset ASCII_GRAPHIC; // == GRAPHIC_IRV |
| public static final Charset GRAPHIC_IRV; |
| public static final Charset ASCII_FULL; // == ISO8BIT |
| public static final Charset ISO8BIT; |
| public static final Charset LATIN1; |
| public static final Charset UTF32; |
| public static final Charset UTF16; |
| public static final Charset UTF8; |
| |
| static { |
| HsqlName name; |
| |
| name = HsqlNameManager.newInfoSchemaObjectName("SQL_TEXT", false, |
| SchemaObject.CHARSET); |
| SQL_TEXT = new Charset(name); |
| |
| // |
| name = HsqlNameManager.newInfoSchemaObjectName("SQL_IDENTIFIER", |
| false, SchemaObject.CHARSET); |
| SQL_IDENTIFIER_CHARSET = new Charset(name); |
| |
| // |
| name = HsqlNameManager.newInfoSchemaObjectName("SQL_CHARACTER", false, |
| SchemaObject.CHARSET); |
| SQL_CHARACTER = new Charset(name); |
| |
| // |
| name = HsqlNameManager.newInfoSchemaObjectName("LATIN1", false, |
| SchemaObject.CHARSET); |
| LATIN1 = new Charset(name); |
| |
| // |
| name = HsqlNameManager.newInfoSchemaObjectName("ASCII_GRAPHIC", false, |
| SchemaObject.CHARSET); |
| ASCII_GRAPHIC = new Charset(name); |
| |
| // |
| name = HsqlNameManager.newInfoSchemaObjectName("GRAPHIC_IRV", false, |
| SchemaObject.CHARSET); |
| GRAPHIC_IRV = new Charset(name); |
| |
| // |
| name = HsqlNameManager.newInfoSchemaObjectName("ASCII_FULL", false, |
| SchemaObject.CHARSET); |
| ASCII_FULL = new Charset(name); |
| |
| // |
| name = HsqlNameManager.newInfoSchemaObjectName("ISO8BIT", false, |
| SchemaObject.CHARSET); |
| ISO8BIT = new Charset(name); |
| |
| // |
| name = HsqlNameManager.newInfoSchemaObjectName("UTF32", false, |
| SchemaObject.CHARSET); |
| UTF32 = new Charset(name); |
| |
| // |
| name = HsqlNameManager.newInfoSchemaObjectName("UTF16", false, |
| SchemaObject.CHARSET); |
| UTF16 = new Charset(name); |
| |
| // |
| name = HsqlNameManager.newInfoSchemaObjectName("UTF8", false, |
| SchemaObject.CHARSET); |
| UTF8 = new Charset(name); |
| /* |
| * Foundattion 4.2.1 |
| * Character sets defined by standards or by SQL-implementations reside |
| * in the Information Schema (named INFORMATION_SCHEMA) in each catalog, |
| * as do collations defined by standards and collations, |
| * transliterations, and transcodings defined by SQL implementations. |
| */ |
| } |
| |
| public static final Type CARDINAL_NUMBER; |
| public static final Type YES_OR_NO; |
| public static final Type CHARACTER_DATA; |
| public static final Type SQL_IDENTIFIER; |
| public static final Type TIME_STAMP; |
| |
| static { |
| HsqlName name; |
| |
| name = HsqlNameManager.newInfoSchemaObjectName("CARDINAL_NUMBER", |
| false, SchemaObject.DOMAIN); |
| CARDINAL_NUMBER = new NumberType(Types.SQL_BIGINT, 0, 0); |
| CARDINAL_NUMBER.userTypeModifier = new UserTypeModifier(name, |
| SchemaObject.DOMAIN, CARDINAL_NUMBER); |
| |
| // |
| name = HsqlNameManager.newInfoSchemaObjectName("YES_OR_NO", false, |
| SchemaObject.DOMAIN); |
| YES_OR_NO = new CharacterType(Types.SQL_VARCHAR, 3); |
| YES_OR_NO.userTypeModifier = new UserTypeModifier(name, |
| SchemaObject.DOMAIN, YES_OR_NO); |
| |
| // |
| name = HsqlNameManager.newInfoSchemaObjectName("CHARACTER_DATA", |
| false, SchemaObject.DOMAIN); |
| CHARACTER_DATA = new CharacterType(Types.SQL_VARCHAR, (1 << 16)); |
| CHARACTER_DATA.userTypeModifier = new UserTypeModifier(name, |
| SchemaObject.DOMAIN, CHARACTER_DATA); |
| |
| // |
| name = HsqlNameManager.newInfoSchemaObjectName("SQL_IDENTIFIER", |
| false, SchemaObject.DOMAIN); |
| SQL_IDENTIFIER = new CharacterType(Types.SQL_VARCHAR, 128); |
| SQL_IDENTIFIER.userTypeModifier = new UserTypeModifier(name, |
| SchemaObject.DOMAIN, SQL_IDENTIFIER); |
| |
| // |
| name = HsqlNameManager.newInfoSchemaObjectName("TIME_STAMP", false, |
| SchemaObject.DOMAIN); |
| TIME_STAMP = new DateTimeType(Types.SQL_TIMESTAMP, |
| Types.SQL_TIMESTAMP, 6); |
| TIME_STAMP.userTypeModifier = new UserTypeModifier(name, |
| SchemaObject.DOMAIN, TIME_STAMP); |
| } |
| |
| public static final void checkSchemaNameNotSystem(String name) { |
| |
| if (isSystemSchemaName(name)) { |
| throw Error.error(ErrorCode.X_42503, name); |
| } |
| } |
| |
| public static final boolean isSystemSchemaName(String name) { |
| |
| if (SqlInvariants.DEFINITION_SCHEMA.equals(name) |
| || SqlInvariants.INFORMATION_SCHEMA.equals(name) |
| || SqlInvariants.SYSTEM_SCHEMA.equals(name) |
| || SqlInvariants.SQLJ_SCHEMA.equals(name)) { |
| return true; |
| } |
| |
| return false; |
| } |
| |
| public static final boolean isLobsSchemaName(String name) { |
| |
| if (SqlInvariants.LOBS_SCHEMA.equals(name)) { |
| return true; |
| } |
| |
| return false; |
| } |
| |
| public static final boolean isSchemaNameSystem(HsqlName name) { |
| |
| if (name.schema != null) { |
| name = name.schema; |
| } |
| |
| if (SqlInvariants.INFORMATION_SCHEMA_HSQLNAME.equals(name) |
| || SqlInvariants.SYSTEM_SCHEMA_HSQLNAME.equals(name) |
| || SqlInvariants.SQLJ_SCHEMA_HSQLNAME.equals(name)) { |
| return true; |
| } |
| |
| return false; |
| } |
| } |