How to make a table column case insensitive in Firebird server? - firebird

How to make a table column case insensitive in Firebird server?
I am using this code, but it's not working..
con.opne();
cmd = new FbCommand("ALTER TABLE asco ALTER COLUMN Final_Model VARCHAR(30) COLLATE Latin1_General_CS_AS NULL", con);
cmd.ExecuteNonQuery();
con.close();
Error:
ERROR:Dynamic SQL Error
SQL error code = -104
Token unknown - line 1, column 43
VARCHAR

There are several problems with your statement. First of all, according to the Interbase 6.0 language reference (available from the documentation section of the Firebird site) section ALTER TABLE (page 28), the correct syntax is:
ALTER TABLE table <operation> [, <operation> ...];
<operation> = {...
| ALTER [COLUMN] column_name <alt_col_clause>
...}
<alt_col_clause> = {...
| TYPE new_col_datatype
...}
Notice that new_col_datatype is not further expanded upon (datatype is however on page 29). In other words the statement should at least be:
ALTER TABLE asco
ALTER COLUMN Final_Model
TYPE VARCHAR(30)
Note the TYPE between the column name and the datatype. The order of the BNF productions in the Language Reference could make you think that you can also alter the collation of a column, unfortunately you can't.
So if you want to change the collation, you will have to create a new column with the right collation, copy the content and then drop the old column (and rename the new column to the name of the old). See also this thread on the Firebird-support list.
And finally I want to point out that 1) Latin1_General_CS_AS is a case sensitive collation and not insensitive as stated in your question and 2) Firebird does not know the collation Latin1_General_CS_AS (the closest to what you need is probably the default collations WIN_PTBR or FR_FR_CI_AI, otherwise you can create one yourself using CREATE COLLATION).

Related

Postgres - How to add new column uuid

I need to add new column on my table would be uuid data type, here my code:
ALTER TABLE core.example add COLUMN newcolumn SET DATA TYPE UUID USING (uuid_generate_v4())
but show me this error:
ERROR: type modifier is not allowed for type "uuid"
LINE 1: ALTER TABLE core.example add COLUMN newsi UUID (uuid_genera...
I dont want to alter a column, would be to create a new column on my table. Any idea how to make this?
Regards
When adding a new column you don't use SET DATA TYPE. Your statement should look like:
ALTER TABLE core.example ADD COLUMN newcolumn UUID DEFAULT (uuid_generate_v4());
The DEFAULT clause will immediately fill the column with UUIDs.
Alternatively if you you just want to fill the column with initial data, you can drop the DEFAULT clause afterward:
ALTER TABLE core.example ALTER COLUMN newcolumn DROP DEFAULT;
Note that if you are using Postgres 13 and newer it is generally preferrable to use gen_random_uuid() since that method is built-in and does not rely on the uuid-ossp extension.

Setting multiple alter statements on a single column in one command SQL

I am trying to modify a column data type and name in one command.
Is it possible to apply multiple alter statements on one column in one code line? Is that the correct syntax?
ALTER TABLE tb_table
ALTER COLUMN colum_date
SET DATA TYPE TIMESTAMP NOT NULL
RENAME COLUMN colum_date TO colum_timestamp;
I have been looking for related bibliography but could not find much information on the web.
According to the documentation renaming a column is an action that cannot be combined with others but requires its own statement. So no, you cannot do what you want in one statement.
But you can do it in one transaction. Setting the datatype and setting the NOT NULL constraint requires two actions though. But both of that actions can be in one statement.
BEGIN TRANSACTION;
ALTER TABLE tb_table
ALTER COLUMN colum_date
SET DATA TYPE TIMESTAMP,
ALTER COLUMN colum_date
SET NOT NULL;
ALTER TABLE tb_table
RENAME COLUMN colum_date
TO colum_timestamp;
COMMIT TRANSACTION;

PGSQL - Change all columns of a specific datatype to text

I'm trying to change all the USER-DEFINED columns to TEXT in a specific view using pgsql.
Is it possible to do that in a single alter table query ou do I need to check first what columns contain that dataype and then perform the dataype change one by one?
This is what I'm trying:
ALTER TABLE if exists "schemaName"."Table_A"
ALTER COLUMN (
select column_name
from information_schema.columns inf
where table_name = 'Table_A' and inf.data_type = 'USER-DEFINED')
TYPE TEXT;
I'm getting and error in the subquery start "("
You need to do this one by one. Generally speaking such DDL statements cannot work on several objects in one statement.
For ALTER TABLE, see: https://www.postgresql.org/docs/12/sql-altertable.html.
FOR ALTER VIEW, see: https://www.postgresql.org/docs/current/sql-alterview.html

How change a column type in Firebird 3

Since Firebird 3, I can't modify a column type.
Before I use this kind of update:
update RDB$RELATION_FIELDS set
RDB$FIELD_SOURCE = 'MYTEXT'
where (RDB$FIELD_NAME = 'JXML') and
(RDB$RELATION_NAME = 'XMLTABLE')
because I get ISC error 335545030 ("UPDATE operation is not allowed for system table RDB$RELATION_FIELDS").
Maybe there is another way in Firebird 3?
Firebird 3 no longer allows direct updates to the system tables, as that was a way to potentially corrupt a database. See also System Tables are Now Read-only in the release notes. You will need to use DDL statements to do the modification.
It looks like you want to change the data type of a column to a domain. You will need to use alter table ... alter column ... for that. Specifically you will need to do:
alter table XMLTABLE
alter column JXML type MYTEXT;
This does come with some restrictions:
Changing the Data Type of a Column: the TYPE Keyword
The keyword TYPE changes the data type of an existing column to
another, allowable type. A type change that might result in data loss
will be disallowed. As an example, the number of characters in the new
type for a CHAR or VARCHAR column cannot be smaller than the existing
specification for it.
If the column was declared as an array, no change to its type or its
number of dimensions is permitted.
The data type of a column that is involved in a foreign key, primary
key or unique constraint cannot be changed at all.
This statement has been available since before Firebird 1 (InterBase 6.0).
Firebird 2.5 manual, chapter Data Definition (DDL) Statement, section TABLE:
ALTER TABLE tabname ALTER COLUMN colname TYPE typename

Double quote in the name of table in select query of PostgreSQL

I am running following simple select query in PostgreSQL:
SELECT * FROM "INFORMATION_SCHEMA.KEY_COLUMN_USAGE"
It gives me following error report:
ERROR: relation "INFORMATION_SCHEMA.KEY_COLUMN_USAGE" does not exist
LINE 1: SELECT * FROM "INFORMATION_SCHEMA.KEY_COLUMN_USAGE"
^
********** Error **********
ERROR: relation "INFORMATION_SCHEMA.KEY_COLUMN_USAGE" does not exist
SQL state: 42P01
Character: 15
But when I am running the following query it runs successfully:
SELECT * FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
Again when I select from a table created by me the situation is reversed. Following one fails:
SELECT * FROM countryTable
while following one runs successfully.
SELECT * FROM "countryTable"
Why is it happening? What is the problem?
You probably created your table so:
CREATE TABLE "countryTable" (
id SERIAL NOT NULL,
country TEXT NOT NULL,
PRIMARY KEY(id)
);
Which create a tablespace wrapped in "", you shouldn't use double quote in general in postgres for table names or columns, try without double quotes:
CREATE TABLE countryTable (
id SERIAL NOT NULL,
country TEXT NOT NULL,
PRIMARY KEY(id)
);
An then you can use this query you already have SELECT * FROM countryTable
While my personal advice is to use legal, lower-case names exclusively and never use double-quote, it is no problem per se.
When you look at the table definition in psql (\d tbl), or at table names in the system catalog pg_class or column names in pg_attributes or any of the information schema views, you get identifiers in their correct spelling (and with all other oddities that may have been preserved by double-quoting them). You can use quote_ident() to quote such names automatically as needed - it only adds double quotes if necessary.
Postgres itself isn't foolish enough to use CaMeL case names. All objects in the information schema or in the system catalog are lower-cased (the names of the system tables and columns, not the names of user tables they carry as data).
Start at the basics, read the manual about identifiers.