/** INTERNAL: Return the create table statement. */
 public Writer buildCreationWriter(AbstractSession session, Writer writer)
     throws ValidationException {
   try {
     DatabasePlatform platform = session.getPlatform();
     writer.write("CREATE PACKAGE " + getFullName());
     writer.write(" AS");
     writer.write("\n");
     for (Enumeration statementsEnum = getStatements().elements();
         statementsEnum.hasMoreElements(); ) {
       writer.write((String) statementsEnum.nextElement());
       writer.write(platform.getBatchDelimiterString());
       writer.write("\n");
     }
     for (Enumeration proceduresEnum = getProcedures().elements();
         proceduresEnum.hasMoreElements(); ) {
       writer.write("\n");
       String procedureString =
           ((StoredProcedureDefinition) proceduresEnum.nextElement())
               .buildCreationWriter(session, writer)
               .toString();
       writer.write(procedureString.substring(7, procedureString.length()));
       writer.write("\n");
     }
     writer.write(platform.getBatchEndString());
     writer.write("\n" + session.getPlatform().getStoredProcedureTerminationToken());
   } catch (IOException ioException) {
     throw ValidationException.fileError(ioException);
   }
   return writer;
 }
 /**
  * If using native SQL then print a byte[] literally as a hex string otherwise use ODBC format as
  * provided in DatabasePlatform.
  */
 protected void appendByteArray(byte[] bytes, Writer writer) throws IOException {
   if (usesNativeSQL()) {
     writer.write("Ox");
     Helper.writeHexString(bytes, writer);
   } else {
     super.appendByteArray(bytes, writer);
   }
 }
 /**
  * Appends an MySQL specific Timestamp, if usesNativeSQL is true otherwise use the ODBC format.
  * Native Format: 'YYYY-MM-DD HH:MM:SS'
  */
 protected void appendCalendar(Calendar calendar, Writer writer) throws IOException {
   if (usesNativeSQL()) {
     writer.write("TIMESTAMP '");
     writer.write(Helper.printCalendarWithoutNanos(calendar));
     writer.write("'");
   } else {
     super.appendCalendar(calendar, writer);
   }
 }
 /**
  * Appends an MySQL specific Timestamp, if usesNativeSQL is true otherwise use the ODBC format.
  * Native Format: 'YYYY-MM-DD HH:MM:SS'
  */
 protected void appendTimestamp(java.sql.Timestamp timestamp, Writer writer) throws IOException {
   if (usesNativeSQL()) {
     writer.write("TIMESTAMP '");
     writer.write(Helper.printTimestampWithoutNanos(timestamp));
     writer.write("'");
   } else {
     super.appendTimestamp(timestamp, writer);
   }
 }
 /**
  * Appends an MySQL specific time if usesNativeSQL is true otherwise use the ODBC format. Native
  * FORMAT: 'HH:MM:SS'.
  */
 protected void appendTime(java.sql.Time time, Writer writer) throws IOException {
   if (usesNativeSQL()) {
     writer.write("TIME '");
     writer.write(Helper.printTime(time));
     writer.write("'");
   } else {
     super.appendTime(time, writer);
   }
 }
 /**
  * Appends an MySQL specific date if usesNativeSQL is true otherwise use the ODBC format. Native
  * FORMAT: 'YYYY-MM-DD'
  */
 protected void appendDate(java.sql.Date date, Writer writer) throws IOException {
   if (usesNativeSQL()) {
     writer.write("DATE '");
     writer.write(Helper.printDate(date));
     writer.write("'");
   } else {
     super.appendDate(date, writer);
   }
 }
 /** Initialize any platform-specific operators */
 protected void initializePlatformOperators() {
   super.initializePlatformOperators();
   addOperator(ExpressionOperator.simpleTwoArgumentFunction(ExpressionOperator.Concat, "CONCAT"));
   addOperator(operatorOuterJoin());
   addOperator(ExpressionOperator.ifNull());
 }